【正经题解】摆花
2024-02-23 11:13:44
发布于:浙江
29阅读
0回复
0点赞
一个三维数组
[ ][ ][ ]表示前 朵花,第 种花,有 株。
#include<bits/stdc++.h>
using namespace std;
int n,m,a[101],f[101][101][101],ans=0,x,y,z;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=0;i<=n;i++)
f[0][i][0]=1; //预处理,~~表示前0朵花,第i种花种了,0株~~。可以选择自动忽略~ 但是如果没有预处理,后面就全是0
for (int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
for (int k=0;k<=min(a[j],i);k++){
if (k>1) f[i][j][k]=f[i-1][j][k-1];
else for (int z=0;z<=min(a[j-1],i-k);z++) f[i][j][k]+=f[i-k][j-1][z],f[i][j][k]%=1000007;
}//暴力的三重循环
//对了,转移方程是从前k朵花,第j-1种花,种了K朵转移来的(当k>1时)(其实这就是把数据搬运到了后面,可以改为二维的
//不然就从前一盆花转移过来
for (int i=0;i<=min(m,a[n]);i++)
ans+=f[m][n][i],ans%=1000007; //找到最后一朵花种都种掉了时,ans的最大值,不要忘了“0” “0” “0” (种0朵的情况)
printf("%d",ans);
return 0;
}
这里空空如也
有帮助,赞一个