递归与递推青蛙过河

Posted 听风不成泣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归与递推青蛙过河相关的知识,希望对你有一定的参考价值。

题目描述

有一条河,左边一个石墩(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,计算并输出最多能有多少只青蛙可以根据以上规则顺利过河?

输入

一行两个整数h和k,分别表示k片荷叶和h个石墩

输出

输出最多能有多少只青蛙可以根据以上规则顺利过河

样例输入

2 3

样例输出

16

 

思路:递推(dp)

首先,青蛙只能往前跳,不能往后跳,而且只能12345这样排下去,所以要想使最多的青蛙到达对岸,只需使编号最大的青蛙首先跳到对岸(否则编号更大的青蛙就跳不过去了)。

然后,要想使编号最大的青蛙首先跳到对岸,只需让河面上承载最多的青蛙。而荷叶上只能承载一只青蛙,所以需要让青蛙尽可能多地叠到石墩上。

接下来便是核心内容:(f[i]表示当有k个荷叶,i个石墩时过河青蛙的最大数量)

1、若有k个荷叶,没有石墩,则最多有k+1个青蛙。所以f[0]=k+1(不需要解释了吧);

2、若有k个荷叶,1个石墩,则只需要使石墩上承载最多的青蛙。进一步分析,我们只需要将石墩当做对岸,这样就变成1的情况了。所以f[1]=f[0]+k+1;

3、若有k个荷叶,2个石墩,则需要先让石墩1作为对岸,叠完后再让石墩2作为对岸。所以f[2]=f[1]+f[0]+k+1;

继续往下推理,得到状态转移方程:f[h]=f[0]+f[1]+f[2]+……+f[h-1]+k+1;

代码:

技术分享图片
 1 #include <iostream>
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 int n,m,sum;
 5 int a[10000];
 6 int main()
 7 {
 8     scanf("%d%d",&n,&m);
 9     a[0]=m+1;
10     sum=a[0];
11     for(int i=1;i<=n;i++)
12     {
13         a[i]=sum;
14         sum+=a[i];
15     }
16     cout << sum << endl;
17     return 0;
18 }
View Code

 

以上是关于递归与递推青蛙过河的主要内容,如果未能解决你的问题,请参考以下文章

递归与递推一

推箱子,递归与递推

递归与递推电话号码

递归与递推电话号码

递归与递推排序集合

递归与递推编码