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
遞推
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章