青蛙过河 [递推法]


题目描述

有一条河,左边一个石墩( A A A区)上有编号为 1 , 2 , 3 , 4 , … , n 1,2,3,4,…,n 1234n 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(i1,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;
}

猜你喜欢

转载自blog.csdn.net/DUXS11/article/details/132079158