【大意】一些荷叶(一次只能站一个青蛙),一些石墩(叠加站在石墩上)。对岸有个B石墩(到B就不能走了)。编号i为青蛙叠加跳到石墩上必须踩在i-1的青蛙上。因此青蛙到达B(B是个石墩)的顺序也必须是X,X-1,X-2...3,2,1,题目是求解这个X.
【解法】递推(DP)
F[i][j]表示i个石墩j个荷叶能通过多少蛙
先看 F[0][j],1个石墩j个荷叶,最大青蛙跳到B,剩下的蛙跳到j个荷叶上,再依次跳到B,因此是j+1
F[1][j],1个石墩j个荷叶,最优应该是让青蛙占D1去(当成B跳,可以跳F[0][j]个),再占B,因此是F[0][j] * 2
F[2][j],2个石墩j个荷叶,最优应该是让青蛙再占D2(D2当成B,可以跳F[1][j],因为还有D1),再占D1(F[0][j]),最后再占B(F[0][j]),因此是F[1][j] + F[0][j] *2
...
F[i][j] = f[0][j]+f[1][j]+f[2][j]+..+f[i-1][j];
可以一步计算为:2^i * f[0][j] = (1<<i) * (m+1)
#include <iostream>
using namespace std;
int n, m; //石墩 & 荷叶
int main() {
cin >> n >> m;
cout << (1 << n) * (m + 1);
return 0;
}
(可以看出,M起不到很大作用)