您的位置:首页 > 其它

记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof

2015-05-12 16:18 701 查看
题目传送门

 /*
记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数
ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + 1);前者表示蛋没碎,则往高处(y-i)搜索
后者表示蛋碎了,往低处(i-1)方向搜索
这样写不好,每次memset (dp)就会超时:(
详细解释:http://blog.csdn.net/fulongxu/article/details/27110435
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;

const int MAXN = 1e3 + 10;
const int INF = 0x3f3f3f3f;
int dp[11][MAXN];

int DFS(int x, int y)
{
if (dp[x][y])    return dp[x][y];
if (x == 1)    {dp[x][y] = y;    return y;}
if (y <= 2)    {dp[x][y] = y;    return y;}

int ans = INF;
for (int i=2; i<y; ++i)
{
int tmp = max (DFS (x, y-i) + 1, DFS (x-1, i-1) + 1);
ans = min (ans, tmp);
}

return dp[x][y] = ans;
}

int main(void)        //URAL 1223 Chernobyl’ Eagle on a Roof
{
//freopen ("Z.in", "r", stdin);

int n, m;
while (scanf ("%d%d", &n, &m) == 2)
{
if (!n && !m)    break;
if (n > 10)    n = 10;

printf ("%d\n", DFS (n, m));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: