P8786 题解
看到都是顺次转移的动态规划,我来写一个贡献转移。
设
题目中说了初始两斗酒,那么
重点是怎么前推后,依次循环
如果
看花:走到第
酒馆:走到第
状态转移方程:
if (f[i][j][k] != 0)//这里也可以简写成 if(f[i][j][k])
{
f[i + 1][j + 1][k - 1] += f[i][j][k];
f[i + 1][j][k * 2] += f[i][j][k];
}
注意!
首先,再看花变成
其次,这样还会多算。如果不看花只能是没有酒,一直经过酒店,
但是题目要求最后一次只能经过花,所以不行。
还有一个问题:酒的斗数上线是什么?
显然不会超过
代码:
#include <iostream>
using namespace std;
int n, m;
int f[205][105][105];
int main() {
cin >> n >> m;
f[0][0][2] = 1;
for (int i = 0; i < n + m; i ++)
for (int j = 0; j < m; j ++)
for (int k = 0; k <= m; k ++)
if (f[i][j][k]) {
if (k > 0) f[i + 1][j + 1][k - 1] = (f[i + 1][j + 1][k - 1] + f[i][j][k]) % 1000000007;
if (k <= 50) f[i + 1][j][k * 2] = (f[i + 1][j][k * 2] + f[i][j][k]) % 1000000007;
}
cout << f[n + m][m][0];
return 0;
}