点击跳转例题
思路:
动态规划,f(i,j,k)表示遇到前 i 个店,遇到 j 朵花,还剩 k 斗酒的方案之和。
转移分别写对应的方法:翻倍和减一。
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e5+10,M=2e2+10,mod=1e9+7,INF=0x3f3f3f3f; int a[N],b[N],c[N],pre[N]; int f[M][M][M]; signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); 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++) { //if(!i&&!j)continue; for(int k=0;k<=m;k++) { if(k%2==0&&i) f[i][j][k]=(f[i][j][k]+f[i-1][j][k/2])%mod; if(j) f[i][j][k]=(f[i][j-1][k+1]+f[i][j][k])%mod; } } } //因为题上说了最后一次是遇到的花,所以不能用f[n][m][0]; cout<<f[n][m-1][1]<<endl; return 0; }
P8786 [蓝桥杯 2022 省 B] 李白打酒加强版--2024蓝桥杯冲刺省一
![](https://img-home.csdnimg.cn/images/20240711042549.png)