[NOIOJ7627]鸡蛋的硬度(dp)

来源:互联网 发布:网络教育在哪里报名 编辑:程序博客网 时间:2024/04/29 13:05

[NOIOJ7627]鸡蛋的硬度

http://noi.openjudge.cn/ch0206/7627/

由于原题意太复杂,我简化了题目:

给出N个硬度相同的鸡蛋,一座M层的楼
如果鸡蛋在i楼不摔碎而在i+1楼摔碎,则表示鸡蛋的硬度是i,你可以在任意一楼丢鸡蛋。
求出这些鸡蛋的硬度
输入包括多组数据,每组输入N,M,输出硬度,输出使用最优策略在最坏情况下所需要的扔鸡蛋次数。每组数据1行

Sample Input

100 1100 2

Sample Output

10014

f[i][j]表示第i层j个鸡蛋的最优解

那么dp方程就是这样的:

f[i][j]=min(f[i][j],max(f[i-1][m-1],f[n-i][m])+1);

为什么?让我们来看下解析:
这里写图片描述

假如说,我们在黄色这一层丢下鸡蛋。
如果鸡蛋破了,则说明确认硬度的层在黄色层以下。那么范围就是蓝色部分。同时鸡蛋少了一个。(f[i-1][m-1])

如果鸡蛋没破,那么说明确认硬度的层在黄色层及以上,范围就是红色部分。鸡蛋没有少。(f[x-i][m],x是没有确定的层数)

那么确认了范围之后,我们把不需要的部分切掉(作为子问题)比如只保留红色部分。那么红色就还是一幢楼。无论怎么切,它都是连续的。而且剩余层数相同时处理方式是一样的,所以只需要传递剩余楼层x和鸡蛋数y。

C++code:

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int f[110][110];int main(){    int n,m,i,j,k;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=1;i<=n;i++)            for(j=1;j<=m;j++)                f[i][j]=i;        for(i=1;i<=n;i++)            for(j=1;j<=i;j++)                for(k=2;k<=m;k++)                    f[i][k]=min(f[i][k],max(f[j-1][k-1],f[i-j][k])+1);        printf("%d\n",f[n][m]);    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大王卡变3g网是怎么办 无法解析服务器的dns地址怎么办 笔记本dns辅服务器未响应怎么办 原营业执照注销法人没在怎么办? 加盟骗局公安局工商局不管怎么办 发现老婆衣柜里有避孕套怎么办 2岁宝宝爱舔东西怎么办 痔疮手术后痛疼怎么办 长了内痔疮该怎么办 淘宝卖家遇到恶意买家怎么办 淘宝遇到恶意买家拍单怎么办 淘宝遇到买家恶意搞坏商品怎么办 木油味道很重怎么办 床垫外面布坏了怎么办 淘宝店铺动态评分低怎么办 实创倒闭返款怎么办 qq红包忘记支付密码怎么办 qq红包支付密码忘了怎么办 个人卖东西人家要发票怎么办 打了欠条找不到人怎么办 公章掉进水里了怎么办 手游吃鸡限制登入15分钟怎么办 宝宝的小鸡淹了怎么办 宝宝小鸡底下淹了怎么办 4岁宝宝拉稀水怎么办 2岁半宝宝对眼怎么办 孩子在幼儿园中午不睡觉怎么办 20天婴儿拉稀水怎么办 3个月婴儿拉水怎么办 两岁宝宝拉水怎么办 1岁半宝宝拉水怎么办 5周孩子小鸡长脂肪粒怎么办 小孩丁丁长歪了怎么办 2个月的婴儿咳嗽怎么办 2个月的宝宝干咳怎么办 2月宝宝感冒咳嗽怎么办 产妇肚子上长小疙瘩很痒怎么办 泰迪生下小狗不吃奶怎么办? 刚生的狗不吃奶怎么办 刚出生的小牛不吃奶怎么办 吃奶的狗崽拉稀怎么办