动态规划(三维)直接按照题目条件
竞赛中心 - 蓝桥云课
#include <iostream>
#define int long long
const int A=101;
using namespace std;
const int MOD=1000000007;
int dp[A][A][A];
signed main()
{// 请在此输入您的代码int N,M;cin>>N>>M;dp[0][0][2]=1;for(int i=0;i<=N;i++){for(int j=0;j<=M;j++){for(int k=0;k<=M;k++){if(i>0&&k%2==0){dp[i][j][k]+=dp[i-1][j][k/2]%MOD;}if(j>0&&k>0){dp[i][j][k]+=dp[i][j-1][k+1]%MOD;}}}}cout<<dp[N][M-1][1]%MOD<<endl;return 0;
}
题目中有三个变化量,店数,花数,酒数,设dp[i][j][k]表示在遇到i个店,j个花后还剩k个酒的方案数。
状态转移方程:
if(i>0&&k%2==0){dp[i][j][k]+=dp[i-1][j][k/2]%MOD;}if(j>0&&k>0){dp[i][j][k]+=dp[i][j-1][k+1]%MOD;}
第一种情况:dp[i][j][k]时的方案总数等于此时的方案总数加上遇到店减一时且酒数减半的方案数(这种情况的限定条件是店数大于0,k是2的倍数,防止数组错误)
第二种情况:dp[i][j][k]时的方案总数等于此时的方案总数加上遇到花减一且酒数加一的方案数(这种情况的限定条件是j与k都大于0)