乌龟棋
感觉是动规
f[i][j][k][u][v]表示到第i个格子,第1,2,3,4种用了几个
这样数组开不下,而i是可以通过j,k,u,v计算出来的,注意加一
#include<iostream> #include<cstdio> using namespace std; const int maxn=1007; int a[maxn],c[maxn],sum[5]; int n,m; int f[47][47][47][47]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) {int b;cin>>b;sum[b]++;} f[0][0][0][0]=a[1]; for(int i=0;i<=sum[1];i++){ for(int j=0;j<=sum[2];j++){ for(int k=0;k<=sum[3];k++){ for(int u=0;u<=sum[4];u++){ int step=1+i*1+j*2+k*3+u*4; if(i) f[i][j][k][u]=max(f[i][j][k][u],f[i-1][j][k][u]+a[step]); if(j) f[i][j][k][u]=max(f[i][j][k][u],f[i][j-1][k][u]+a[step]); if(k) f[i][j][k][u]=max(f[i][j][k][u],f[i][j][k-1][u]+a[step]); if(u) f[i][j][k][u]=max(f[i][j][k][u],f[i][j][k][u-1]+a[step]); } } } } cout<<f[sum[1]][sum[2]][sum[3]][sum[4]]<<endl; return 0; }
一开始想的是搜索,想着动规怎么记录每种牌用了几个,这其实不认识动规