[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\n",arr[n][m]); } return 0; }