UVa 10934 - Dropping water balloons(DP)
2015-08-29 18:01
357 查看
给出nn个相同的气球,kk层楼,问最少几次试验可以知道气球最高从多少层扔下不会爆。
用d[i][j]d[i][j]表示用ii个球,实验jj次所能确定的最高楼层数,对于每一次试验分爆和不爆两种情况讨论:
1、爆了,转移到d[i−1][j−1]+1d[i-1][j-1]+1,用掉了1个球和一次试验机会。
2、没爆,将当前测试层数的上一层当做第1层继续进行试验,转移到d[i][j−1]d[i][j-1]。
得出转移方程d[i][j]=d[i−1][j−1]+1+d[i][j−1]d[i][j]=d[i-1][j-1]+1+d[i][j-1]。
好久之前做的题了,具体思路见紫书。
用d[i][j]d[i][j]表示用ii个球,实验jj次所能确定的最高楼层数,对于每一次试验分爆和不爆两种情况讨论:
1、爆了,转移到d[i−1][j−1]+1d[i-1][j-1]+1,用掉了1个球和一次试验机会。
2、没爆,将当前测试层数的上一层当做第1层继续进行试验,转移到d[i][j−1]d[i][j-1]。
得出转移方程d[i][j]=d[i−1][j−1]+1+d[i][j−1]d[i][j]=d[i-1][j-1]+1+d[i][j-1]。
好久之前做的题了,具体思路见紫书。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef unsigned long long ULL; ULL d[110][65],k,n; int main(){ for(int i=1;i<110;++i) for(int j=1;j<65;++j) d[i][j]=d[i-1][j-1]+1+d[i][j-1]; while(~scanf("%llu%llu",&k,&n)&&k){ int ans = 0; for(int i=64;i>=0;--i) if(d[k][i]<n){ ans=i+1; break; } if(ans<=63) printf("%d\n",ans); else puts("More than 63 trials needed."); } return 0; }
相关文章推荐
- CentOS图形界面的开启与关闭
- Tomcat在RedHat Linux上的安装与配置
- linux磁盘管理:LVM的基本概念与创建、扩展、缩减、删除
- linux环境下LNMP和mantis的配置笔记
- Linux忘记root密码解决办法
- 网页网站开发
- linux运维实战练习--用户和组管理各命令的使用
- 使用Docker部署PHP应用的设计方案
- linux常用命令汇总(pwd,echo,history,nano)
- NAND FLASH控制器
- Linux系统下如何SSH免密码登录
- 44_02 nginx
- Apache与Tomcat
- linux驱动调试技术
- Zabbix监控平台汉化修改
- Shell编程(正则表达式)学习笔记
- Apache与Nginx的优缺点比较
- Apache与Tomcat 区别联系
- 架构解耦
- Linux学习之LVM文件系统