青蛙过河 [递推法]
- 题目描述
- 输入输出样例
- 输入样例
- 输出样例
- 递推解答
- A C 代码
题目描述
有一条河,左边一个石墩( A A A区)上有编号为 1 , 2 , 3 , 4 , … , n 1,2,3,4,…,n 1,2,3,4,…,n的 n n n只青蛙,河中有 k k k个荷叶( C C C区),还有 h h h个石墩( D D D区),右边有一个石墩( B B B区),如下图所示。 n n n只青蛙要过河(从左岸石墩 A A A到右岸石墩 B B B),规则为:
- 石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小);
- 青蛙可以: A A A→ B B B(可以从 A A A跳到 B B B,下同), A A A→ C C C, A A A→ D D D, C C C→ B B B, D D D→ B B B, D D D→ C C C, C C C→ D D D;
- 当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大1号的青蛙上面。
你的任务是对于给出的 h h h, k k k,计算并输出最多能有多少只青蛙可以根据以上规则顺利过河?
输入输出样例
输入样例
2 2 2 3 3 3
河中间有 2 2 2个石礅, 3 3 3个荷叶
输出样例
16 16 16
最多有 16 16 16只青蛙可以按照规则过河
递推解答
关键在这里
从具体到一般,推导过程如下:
f ( 0 , 0 ) = 1 f(0,0)=1 f(0,0)=1
f ( 0 , k ) = k + 1 ; f(0,k)=k+1; f(0,k)=k+1; (如 k = 3 k=3 k=3时,有 4 4 4只青蛙可以过河)
f ( 1 , k ) = 2 ( k + 1 ) ; f(1,k)=2(k+1); f(1,k)=2(k+1); (递推思想)
f ( 2 , k ) = 2 ( k + 1 ) × 2 = 2 2 × ( k + 1 ) ; f(2,k)=2(k+1)×2=2^2×(k+1); f(2,k)=2(k+1)×2=22×(k+1);
……
依此类推得递推式: F ( i , k ) = F ( i − 1 , k ) × 2 = 2 i × ( k + 1 ) ; F(i,k)=F(i-1,k)×2=2^i×(k+1); F(i,k)=F(i−1,k)×2=2i×(k+1);
……
因此,结论为: f ( h , k ) = 2 h × ( k + 1 ) f(h,k)=2^h×(k+1) f(h,k)=2h×(k+1)
A C 代码
#include <bits/stdc++.h>
using namespace std;
long long h,k,ans=1;
int main()
{cin >>h >>k;while (h--)ans*=2;ans*=(k+1);cout <<ans;return 0;
}