题目:鸡蛋的硬度
思路:
令f[i][j]为有i层楼j个鸡蛋的最小次数。
假设从第t层楼扔下,鸡蛋碎了,f[i][j]=f[t-1][j-1]+1
假如鸡蛋没碎,f[i][j]=f[i-t][j]+1
所以状态转移方程为f[i][j]=min(f[i][j],1+max(f[t-1][j-1],f[i-t][j]))
代码;
#include<bits/stdc++.h>
using namespace std;
#define n 100
#define m 10
#define inf (1<<30)
int N,M;
int f[n+5][m+5]= {0};
void dp() {
for(int j=2; j<=m; j++) {
for(int i=2; i<=n; i++) {
for(int t=1; t<=i; t++) {
f[i][j]=min(f[i][j],1+max(f[t-1][j-1],f[i-t][j]));
}
}
}
}
void init() {
for(int i=1; i<=n; i++) f[i][1]=i;
for(int i=1; i<=m; i++) f[1][i]=1;
for(int i=2; i<=n; i++) {
for(int j=2; j<=m; j++) {
f[i][j]=inf;
}
}
}
int main() {
init();
dp();
while(~scanf("%d%d",&N,&M)) {
printf("%d\n",f[N][M]);
}
return 0;
}