原题链接1.李白打酒加强版 - 蓝桥云课 (lanqiao.cn)
#include<iostream> #include<algorithm> #include<cstring> using namespace std ; const int N = 110 , M = 1e9 + 7 ; typedef long long LL ; LL f[N][N][N] ;//\\定义三维数组1.由于我们只考虑在m以内酒的数量所以我们只需要将第三维定义到N int main(){ int n , m ; cin >> n >> m; f[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 && k %2 == 0) f[i][j][k] = (f[i][j][k] + f[i-1][j][k/2]) % M;//\\左边 if(j) f[i][j][k] = (f[i][j][k] + f[i][j-1][k+1]) %M;//\\右边 } } } cout << f[n][m-1][1] << endl ;//\\最后一个肯定是花,不是f[n][m][0] 的原因是还包含了可能遇到店的情况 return 0 ; }