[xdoj1007]易碎的鸟蛋(dp)

解题思路:f[n,m]表示n层楼、m个鸡蛋时所需要的最小次数,则

转移方程为:f[n,m] = min{ 1+max(f[i-1,m-1], f[n-i,m]) | i=1..n }初始条件:f[i,0]=0(或f[i,1]=i),对所有i

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
int arr[1002][1002];
int main(){
    int n,m;
    while(cin>>m>>n){
        for(int i=0;i<=n;i++) arr[i][0]=0;
        for(int i=0;i<=n;i++) arr[i][1]=i;
        for(int i=0;i<=m;i++) arr[0][i]=0;
        for(int i=0;i<=m;i++) arr[1][i]=1;
        for(int i=2;i<=n;i++){
            for(int j=2;j<=m;j++){
                arr[i][j]=inf;
            }
        }
        for(int i=2;i<=n;i++){
            for(int j=2;j<=m;j++){
                for(int k=1;k<i;k++){
                    arr[i][j]=min(arr[i][j],1+max(arr[k-1][j-1],arr[i-k][j]));
                }
            }
        }
        printf("%d
",arr[n][m]);
    }
    return 0;
}

  

  

原文地址:https://www.cnblogs.com/elpsycongroo/p/10051795.html