描述
有一个n层的建筑。如果一个鸡蛋从第k层及以上落下,它会碎掉。如果从低于这一层的任意层落下,都不会碎。
有m个鸡蛋,用最坏的情况下实验次数最少的方法去找到k, 返回最坏情况下所需的实验次数。
我们考虑f(n,k)是n层楼k个鸡蛋的答案,枚举在第i层(1≤i≤n)丢鸡蛋,如果第i层碎了: 就还剩k-1个鸡蛋,要用k-1个鸡蛋测1~(i-1)层楼,如果没碎,就要用k个鸡蛋测n-i层楼,所以f(n,k)=min(f(n,k),max(f(n-i,k),f(i-1,k-1))+1)
class Solution {
public:
/**
* @param m: the number of eggs
* @param n: the number of floors
* @return: the number of drops in the worst case
*/
const static int inf=1e9+5;
int f[2005][2005];
int dropEggs2(int m, int n)
{
// write your code here
//f(n,k)=min(f(n,k),max(f(n-i,k),f(i-1,k-1))+1)
for(int i=1;i<=n;i++) f[i][1]=i,f[1][i]=1;
f[0][0]=0,f[1][1]=1;
for(int i=2; i<=n; i++)
{
for(int k=2; k<=m; k++)
{
f[i][k]=inf;
for(int j=1; j<i; j++)
{
f[i][k]=min(f[i][k],max(f[i-j][k],f[j-1][k-1])+1);
//cout<<i<<" "<<k<<" "<<f[i][k]<<endl;system("pause");
}
}
}
return f[n][m];
}
};