dp[ind][cnt] = Min( 1+dp[ind-1][cnt] , 1+Max( dp[k-1][cnt-1] , dp[ind-k][cnt] )
其中 1 < k < ind
ind:层数,cnt: 鸡蛋数,dp[ind][cnt]: ind层,cnt个鸡蛋时最少的扔鸡蛋次数
#include<stdio.h>
#define Max(a,b) (a>b?a:b)
#define Min(a,b) (a<b?a:b)
int dp[105][12];
int main(int argc, char* argv[])
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
for (int i=1;i<=n;i++)
dp[i][1]=i;
for (int cnt=2;cnt<=m;cnt++)
{
for (int ind=1;ind<=n;ind++)
{
dp[ind][cnt]=1+dp[ind-1][cnt];
for (int k=2;k<ind;k++)
dp[ind][cnt]=Min(dp[ind][cnt],1+Max(dp[k-1][cnt-1],dp[ind-k][cnt]));
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}
学习到了y总的方法,好强
i为扔鸡蛋次数,j为鸡蛋个数,dp[i][j]为仍i次鸡蛋,最多碎j个鸡蛋能测出的楼层数
#include<stdio.h>
#define Max(a,b) (a>b?a:b)
#define Min(a,b) (a<b?a:b)
int dp[105][12];
int main(int argc, char* argv[])
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+1;
if(dp[i][m]>=n)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}