Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35090 | 方巾予 | 【S】T3 | C++ | 通过 | 100 | 45 MS | 20100 KB | 2288 | 2024-11-26 19:22:15 |
#include<bits/stdc++.h> using namespace std; #define int long long int n,maxm,w; int c[210],m[210],p[1010]; int f[210][210]; int g[210][210][30][2]; int curm; void init(){ for(int i=0;i<200;i++){ for(int j=0;j<200;j++){ f[i][j]=-0x3f3f3f3f; } } for(int i=0;i<200;i++){ for(int j=0;j<200;j++){ for(int k=0;k<=21;k++){ g[i][j][k][1]=g[i][j][k][0]=-0x3f3f3f3f; } } } } signed main(){ //freopen("test.in","r",stdin); init(); scanf("%lld%lld%lld",&n,&maxm,&w); for(int i=1;i<=n;i++) scanf("%lld",&c[i]); for(int i=1;i<=n;i++) scanf("%lld",&m[i]); for(int i=maxm;i<=(maxm<<1)-2;i++) scanf("%lld",&p[i]); for(int i=1;i<maxm;i++){ p[i]=p[maxm]-(maxm-i)*w; } //5-12 for(int i=1;i<=n;i++){ f[i][i]=p[m[i]]; g[i][i][m[i]][0]=g[i][i][m[i]][1]=f[i][i-1]=0; } f[n+1][n]=0; for(int l=2;l<=n;l++){ for(int i=1;i+l-1<=n;i++){ int j=i+l-1; g[i][j][m[i]][0]=max(g[i][j][m[i]][0],f[i+1][j]); for(int k=i+1;k<=j;k++){ if(c[i]!=c[k]) continue; for(int m1=1;m1<maxm-m[i];m1++){ g[i][j][m[i]+m1][0]=max(g[i][j][m[i]+m1][0],g[k][j][m1][0]+f[i+1][k-1]); } } g[i][j][m[j]][1]=max(g[i][j][m[j]][1],f[i][j-1]); for(int k=i;k<j;k++){ if(c[j]!=c[k]) continue; for(int m1=1;m1<maxm-m[j];m1++){ g[i][j][m[j]+m1][1]=max(g[i][j][m[j]+m1][1],g[i][k][m1][1]+f[k+1][j-1]); } } for(int k=i;k<j;k++){ if(c[i-1]!=c[k+1]||c[j+1]!=c[k]){ f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]); } } if(c[i]==c[j]){ for(int k=i;k<j;k++){ for(int m1=1;m1<maxm;m1++){ for(int m2=1;m2<maxm;m2++){ f[i][j]=max(f[i][j],g[i][k][m1][0]+g[k+1][j][m2][1]+p[m1+m2]); } } } } } } printf("%lld",f[1][n]); return 0; }