先看一下题目吧
样例说明
分析:
看题目还是很容易想到要用动态规划的,题目要求的是求遇到遇到花的次数i=N、遇到店的次数j=M、且剩余酒的量k=0斗的情况有多少种。
由此我们的思路就很容易确定了,即设置一个三维数据f[i][j][k],
i即遇到花的次数,j即遇到店的次数,k即当前酒的量。
f[i][j][k]即遇到花的次数为i,遇到店的次数为j,酒量为k的情况数量。
代码:
#include <iostream>
using namespace std;
int f[110][110][110];
int n,m;
int N=1000000007;
int main() {
cin >> n >> m;
f[0][0][2]=1;//还没有开始走,情况为1
for(int i=0; i<=n; i++)//遇到的花的次数
for(int j=0; j<=m; j++)//遇到的店的次数
for(int k=1; k<=m-j; k++)//k到终点不可能为0的话就不用继续了
{
if(k-1<=m/2)f[i+1][j][2*k]=(f[i+1][j][2*k]+f[i][j][k])%N;//改变下一个遇到店的情况//if条件防止越界
f[i][j+1][k-1]=(f[i][j+1][k-1]+f[i][j][k])%N;//改变下一个遇到花的情况
}
cout << f[n][m][0];//即遇到遇到花的次数i=N、遇到店的次数j=M、且剩余酒的量k=0斗的情况数量。
return 0;
}
欢迎大家讨论和指正