xdoj 易碎的鸟蛋(鹰蛋实验)

#include
using namespace std;
int dp[15][1001];//dp[i][j] 表示i个鸡蛋j层楼 最少可以测试多少次。 
/*
dp[i][j]状态转移方程
枚举k属于 1-j 表示上次测试的楼层
1. 当在k层蛋碎可以不用考虑 k-j 楼了,相当于我们还有i-1个鸡蛋 测试 k-1个楼 这个状态在之前已经更新过了。
2. 当在k层没碎可以不考虑1-k了。相当于 用 i个鸡蛋测试 j-k 个楼,这个状态之前也更新过了。
我们需要把这两种情况下最坏的情况作为我们的测试次数
===》max(dp[i-1][k-1],dp[i][j-k])+1;
*/ 
int main()
{
    for(int i=1;i<=10;i++)//初始化 
    for(int j=1;j<=1000;j++)
    dp[i][j]=100000;
    for(int i=1;i<=10;i++)
    dp[i][0]=0;
    for(int i=1;i<=1000;i++)
    dp[1][i]=i;//如果只有一个蛋只能从一楼慢慢往上试,最坏的情况就是 最高楼才会碎。 

    for(int i=2;i<=10;i++)
    {
        for(int j=1;j<=1000;j++)
        {
            for(int k=1;k<=1000;k++)//k 是我们要决定这次从哪楼测试所以要用dp=min(---,----); 
            {
                dp[i][j]=min(max(dp[i-1][k-1],dp[i][j-k])+1,dp[i][j]); //当确定了从第k楼测试时,我们需要找到在这种测试下最坏的情况,所以要用
                //  max(dp[i-1][k-1],dp[i][j-1])+1 
            }
        }
    }
    int n,k;
    while(cin>>n>>k)
    {
        if(n>10) n=10; //二分是最好的找到能摔碎蛋的楼层的方法,当鸡蛋>10我们直接二分就可以了因为log1000<10;
     cout<

你可能感兴趣的:(xdoj,dp)