您的位置:首页 > 其它

[DP][NOI2000]青蛙过河

2018-01-28 22:26 309 查看
洛谷原题

Codevs原题

【大意】一些荷叶(一次只能站一个青蛙),一些石墩(叠加站在石墩上)。对岸有个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起不到很大作用)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: