【noi.openjudge】7627 鸡蛋的硬度
2016-10-14 19:48
381 查看
dp[i][j]为前i层楼,用j个鸡蛋在最坏情况下要尝试的次数
传子刚开始写了这么一个dp方程
for(int i = 1;i <= n;i ++) for(int j = 1;j <= m;j ++) dp[i][j] = min(dp[i][j],max(dp[i - 1][j - 1],dp[n - i][j]) + 1);
这个是考虑当我手里有j个鸡蛋的时候怎么检验出i层楼……(意会意会)
先把第j个鸡蛋扔到第i层楼上,{{{{如果碎了,那么就在比它低的几层楼检验(
dp[i - 1][j - 1]),因为第j个鸡蛋已经碎了所以只有
j - 1个鸡蛋},{如果没碎,就在比它高的楼层检验,将剩下的楼层拿下来,则就是一个有
n - i层的楼,因为这个鸡蛋没有碎,所以我们有j个鸡蛋},因为我们要求最坏情况,所以在这一小步要取max},因为我们刚刚拿着第j个鸡蛋扔了一下,所以要加1},因为要求最坏情况下的最小值,所以要取min}(因为的有点乱,请自行括号匹配)
但是我们容易看出,当i比较小的时候,在更新
dp[i][j]时
dp[n - i][j]里面存的并不是真正的值
怎么办?
这一类dp适用于 小问题解决后,大问题才能解决 的类型
因为我想得到有i层高的楼的答案需要用到所以比i小的楼的答案,因此我们需要先枚举我们一共有多少层楼
恩恩
FLOYD
#include <cstdio> #include <algorithm> using namespace std; const int MAXN = 100 + 5; int dp[MAXN][MAXN]; void init() { for(int i = 1;i <= 100;i ++) for(int j = 1;j <= 10;j ++) dp[i][j] = i; for(int k = 1;k <= 100;k ++) for(int i = 1;i < k;i ++) for(int j = 2;j <= 10;j ++) dp[k][j] = min(dp[k][j],max(dp[i - 1][j - 1],dp[k - i][j]) + 1); return; } int n,m; int main() { init(); while(scanf("%d %d",&n,&m) != EOF) printf("%d\n",dp [m]); return 0; }
相关文章推荐
- 【noi.openjudge】7627 鸡蛋的硬度
- NOI OpenJudge 7627:鸡蛋的硬度
- noi.openjudge_P7627(鸡蛋的硬度)
- OpenJudge 7627 鸡蛋的硬度
- OpenJudge noi 7267 鸡蛋的硬度
- OpenJudge 7627 鸡蛋的硬度
- NOI 7627:鸡蛋的硬度(dp)
- NOI库7627 鸡蛋的硬度
- 【NOI】7627 鸡蛋的硬度
- noi 7627 鸡蛋的硬度
- noi.openjudge 1.13.15
- OpenJudge noi 2971抓住那头牛(POJ 3278)
- 欧几里得算法初步 & NOI Openjudge 4975 两只鼹鼠
- OpenJudge noi 04网线主管
- NoiOpenJudge 1.13 数根
- Openjudge NOI题库1.11编程基础之二分查找04 网线管理
- NOIOpenjudge 1.13--08特殊日历计算
- OPENJUDGE NOI 7624 山区建小学
- openjudge-noi-2.6-2718:移动路线
- OpenJudge7627 鸡蛋的硬度