ACM 294. [NOI2000] 青蛙过河(递推)

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
	freopen("frog.in","r",stdin);
	freopen("frog.out","w",stdout);

	int n,m;
	cin>>n>>m;

	cout<<(m+1)*(1<<n)<<endl;

	return 0;
}

294. [NOI2000] 青蛙过河 ★☆   输入文件:frog.in   输出文件:frog.out   简单对比
时间限制:1 s   内存限制:128 MB

大小各不相同的一队青蛙站在河左岸的石墩(记为A)上,要过到对岸的石墩(记为D)上去。河心有几片菏叶(分别记为Y1…Ym)和几个石墩(分别记为S1…Sn)。图示如下:

Image:Frog.gif

青蛙的站队和移动方法规则如下:

  1. 每只青蛙只能站在荷叶、石墩,或者仅比它大一号的青蛙背上(统称为合法的落脚点);
  2. 一只青蛙只有背上没有其它青蛙的时候才能够从一个落脚点跳到另一个落脚点;
  3. 青蛙允许从左岸A直接跳到河心的石墩、荷叶和右岸的石墩D上,允许从河心的石墩和荷叶跳到右岸的石墩D上;
  4. 青蛙在河心的石墩之间、荷叶之间以及石墩和荷叶之间可以来回跳动;
  5. 青蛙在离开左岸石墩后,不能再返回左岸;到达右岸后,不能再跳回;
  6. 假定石墩承重能力很大,允许无论多少只青蛙都可呆在上面。但是,由于石墩的面积不大,至多只能有一只青蛙直接站在上面,而其他的青蛙只能依规则1落在比它大一号的青蛙的背上。
  7. 荷叶不仅面积不大,而且负重能力也有限,至多只能有一只青蛙站在上面。
  8. 每一步只能移动一只青蛙,并且移动后需要满足站队规则;
  9. 在一开始的时候,青蛙均站在A上,最大的一只青蛙直接站在石墩上,而其它的青蛙依规则6站在比其大一号的青蛙的背上。

青蛙希望最终能够全部移动到D上,并完成站队。

设河心有m片荷叶和n个石墩,请求出这队青蛙至多有多少只,在满足站队和移动规则的前提下,能从A过到D。

例如,在m=1且 n=1时,河心有一片荷叶(Y1)和一个石墩(S1),此时至多有4只青蛙能够过河(由小到大称为1、2、3、4),过河的一种方法为:

开始

 

1

2

3

4

A    S1    Y1    D

Step 1

1 from A to Y1

2

3

4           1

A    S1    Y1    D

Step 2

2 from A to S1

3

4    2     1

A    S1    Y1    D

Step 3

1 from Y1 to S1

3    1

4    2

A    S1    Y1    D

Step 4

3 from A to Y1

     1

4    2     3

A    S1    Y1    D

Step 5

4 from A to D

     1

     2     3     4

A    S1    Y1    D

Step 6

3 from Y1 to D

     1           3

     2           4

A    S1    Y1    D

Step 7

1 from S1 to Y1

                 3

     2     1     4

A    S1    Y1    D

Step 8

2 from S1 to D

2

3

           1     4

A    S1    Y1    D

Step 9

1 from Y1 to D

                 1

                 2

                 3

                 4

A    S1    Y1    D

此例中,当河心有一片荷叶和一个石墩时,4只青蛙能够跳动9步过河。

[输入文件]

文件仅有两行,每一行仅包含一个整数和一个换行/回车符。第一行的数字为河心的石墩数n(0<=n<=25),第二行为荷叶数m(0<=m<=25)。

[输出文件]

文件中仅包含一个数字和一个换行/回车符。该数字为在河心有n个石墩和m片荷叶时,最多能够过河的青蛙的只数。

[输入输出文件样例]

Input

1
1

Output

4
递推
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章