ccsu 1179 青蛙过河 递推
来源:互联网 发布:mysql 通过字段查询 编辑:程序博客网 时间:2024/05/17 08:06
题目:
有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图2—5所示。
n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为:
1)石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小);
(2)青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D;
(3)当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大1号的青蛙上面。
你的任务是对于给出的h,k,计算并输出最多能有多少只青蛙可以根据以上规则顺利过河?
思路:
若河中没有石墩,则最多只能有m(荷叶数)+1 的青蛙按规则跳到B上,(前m只先呆在荷叶上,1只跳上B,然后……)。
河中有石墩,则将每个石墩看做B,则第一个石墩先可有m+1只青蛙,第二个石墩可有比之前都大的m+1只,然后可将第一个石墩上的青蛙通过荷叶移到第二个石墩上…… 由此可见到达B上的青蛙数等于可以停留在河中的青蛙数。
我们用f[m][n]表示有m个荷叶和n个石柱时,最多有多少只青蛙能够过河。实际上石柱和岸是差不多的,比如如果我们分析有多少只青蛙可以落脚在第n个石柱上,那么显然这是等于f[m][n-1]的,因为只能借助其它n-1根石柱和m个荷叶来达成目的。
于是我们就得到了这样的结论,f[m][n]=f[m][n-1](第n个石柱上的青蛙)+f[m][n-1](剩下的地方所有的可以过到对岸的青蛙)。当然,第n个石柱上的青蛙既然能到达第n个石柱,自然也可以到达右岸,因为对青蛙的操作都是可逆的(逆回去时把原本的A变成D即可)。
根据上面的公式,我们自然可以得到f[m][n]=f[m][0]*2^n,f[m][0]表示没有石柱时一共可以过到对岸的青蛙,自然就是m+1,这样就得到了最后的结果(m+1)*2^n。
代码直接带公式:
#include<iostream>#include<string.h>#include<math.h>using namespace std;int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF) { m=m+1; printf("%.0lf\n",m*pow(2.0,n)); } return 0;}
- ccsu 1179 青蛙过河 递推
- ACM 294. [NOI2000] 青蛙过河(递推)
- 递归与递推 - 青蛙过河
- 递推递归练习 N 青蛙过河
- 递归递推之 青蛙过河
- 递推递归练习N青蛙过河
- 递推递归练习--N(青蛙过河)
- 【递推】过河卒
- 过河卒 ----递推
- 青蛙过河
- 青蛙过河
- 青蛙过河
- 青蛙过河
- 青蛙过河
- 青蛙过河
- 青蛙过河
- 青蛙过河
- 青蛙过河
- IOS学习笔记28—SQLite3第三方库之FMDB
- TC SRM 552 DIV1 100PT(数论)
- RenderToolbox的学习笔记(一)
- 快速排序-几种不同的划分方法
- 我要学ASP.NET MVC 3.0(十八): MVC 3.0 实例系列之表格中合并排序、分页和筛选
- ccsu 1179 青蛙过河 递推
- Linux设备模型
- Java国际化小小示例
- ASP.NET MVC 3.0学习系列(19)-开源控件实现表格排序和分页
- mysql中如何使用INSERT一次性插入多条记录
- CPrcThread<Worker>线程的挂起和恢复
- 分析android异常时的堆栈信息
- 图像去模糊之初探--Single Image Motion Deblurring
- Java中的final,finalized,finally用法