【分类练习2.递归与递推】青蛙过河 | |
|
问题描述
有一条河,左边一个石墩(A区)上有编号为1.2.3.4……n的n只青蛙,河中有个荷叶(C区),还有个石墩(D区),右边有一个石墩(B区),如下图所示。
n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为:
- 石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小);
- 青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D;
- 当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大1号的青蛙上面。
你的任务是对于给出的,计算并输出最多能有多少只青蛙可以根据以上规则顺利过河?
输入格式
两个整数和
输出格式
一个整数,表示最多青蛙数量
样例输入
2 3
样例输出
16
提示
数据范围:
提交
/*思路:
a[n]为有n个石头的青蛙数。
1 如果有s=0个石头,m个荷叶,很显然,可以移动m+1个青蛙。
2 如果有s=1个石头,m个荷叶,那么m个荷叶上的青蛙可以移动到石头上,而石头上也可以放最大的那个青蛙,然后再进行s=0时的操作,共有2*(m+1)个。
3 如果有s=2个石头,m个荷叶,那么第2个石头上,也可以先放最大的青蛙,然后把荷叶上的青蛙放到第二个人石头上,然后第一个石头也是这样,这时,每个石头上都有m+1个青蛙,但是石头上的青蛙是可以重新放回荷叶的,于是,可以把第二个石头上的青蛙放回荷叶,这样就可以把青蛙都移动到第一个石头上,而第二个石头上就可以再放m+1个青蛙,然而根据步骤一,荷叶和b岸也可以放m+1个青蛙,于是一共有2*2(m+1)个,
4 观察会发现,第n个石头上的青蛙数是有n-1个石头上的青蛙数之和,即a[n-1], 于是a[n]=2*a[n-1]。从s=0到s=n有n个2,,所有a[n]=2ˆn*(m+1)。
感想:
题目想起来麻烦但代码非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常非常简单。
(崩溃了老师跑分的时候我文件夹里的代码竟然是我以前的,我也不知道为什么我编译后他不会自动保存啊*/
#include <iostream>
using namespace std;
int main()
{
int n,m;
while(cin>>n>>m)
{
int t=1;
for(int i=0; i<n; i++)
{
t=t*2;
}
cout<<(m+1)*t<<endl;
}
return 0;
}