算法竞赛宝典 递推算法 妖兽特攻队

【问题描述】妖兽特攻队(frog.cpp/c/pas)NOI 2000

不甘心失败的修罗王派出大小各不相同的一队妖兽站在河左岸的石墩(记为A)上,要过到对岸的石礅(记为D)上去执行军事任务。如图8.11所示,河心有几片荷叶(分别记为Y1…Ym)和几个石墩(分别记为S1…Sn)。


妖兽站队和移动方法规则如下:

(1)每只妖兽只能站在荷叶、石墩或者比它大一号的妖兽背上(统称为合法的落脚点);

(2)一只妖兽只有背上没有其他妖兽的时候才能够从一个落脚点跳到另一个落脚点;

(3)妖兽允许从左岸A直接跳到河心的石墩、荷叶和右岸的石墩D上,允许从河心的石墩和荷叶跳到右岸的石墩D上;

(4)妖兽在河心的石墩之间、荷叶之间以及石墩和荷叶之间可以来回跳动;

(5)妖兽在离开左岸石墩后,不能再返回左岸;到达右岸后不能再跳回;

(6)假定石墩承重能力很大,允许无论多少只妖兽都可待在上面。但是由于石墩面积不大,至多只能有一只妖兽直接站在上面,而其他的妖兽只能依规则1落在比它大一号的妖兽背上;

(7)荷叶不仅面积不大,而且负重能力也有限,至多只能有一只妖兽站在上面;

(8)每一步只能移动一只妖兽,并且移动后需要满足站队规则;

(9)在一开始的时候,妖兽均站在A上,最大的一只妖兽直接站在石墩上,而其他的妖兽依规则6站在比其大一号的妖兽背上。

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

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

例如当河心有一片荷叶和一个石墩时,此时最多有4只妖兽跳动9步能够过河。如图所示。

【输入格式】

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

【输出格式】

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

【输入样例】

1

1

【输出样例】

4

//很经典的一种思想转换,每增加一个石墩,就相当于在前面的基础上double一次

//就是你想,在i个石墩的时候,增加一个石墩,此时就有i+1个石墩,把第i+1个石墩看成是对岸,这样就可以把在i的情况下的妖兽跳到第i+1个石墩上,就相当于double一次了

//f(i,j)表示i个荷叶,j个石墩,先让j等于0计算使用i个荷叶时的妖兽数,然后开始计算加上石墩数的时的妖兽数

//最后推到出介个公式f(n,m)=(2^n)*f(0,m);

#include<iostream>
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
int main()
{
	int m,n;
	while(cin>>n>>m)
	{
		m++;
		printf("%d\n",m*(1<<n));
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/CJ_035/article/details/79766978