提交时间:2024-11-27 16:47:23
运行 ID: 35135
#include<bits/stdc++.h> using namespace std; #define ll long long #define N 222 int n,K,w; int c[N],m[N]; ll f[N][N],g[N][N][24][2],P[20]; int main(){ ios::sync_with_stdio(0); cin>>n>>K>>w; for(int i=1;i<=n;i++) cin>>c[i]; for(int i=1;i<=n;i++) cin>>m[i]; for(int i=K;i<=2*K-2;i++) cin>>P[i]; for(int i=K-1;i>=1;i--) P[i]=P[i+1]-w; memset(f,0xc0,sizeof(f)); memset(g,0xc0,sizeof(g)); 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+1][i]=0; memset(g[i+1][i],0,sizeof(g[i+1][i])); } memset(g[1][0],0,sizeof(g[1][0])); f[1][0]=0; for(int len=2;len<=n;len++){ for(int i=1;i+len-1<=n;i++){ int j=i+len-1; g[i][j][m[i]][0]=f[i+1][j]; g[i][j][m[j]][1]=f[i][j-1]; for(int mm=1;mm<=K*2-2;mm++){ for(int p=i+1;p<=j;p++){ if(c[i]==c[p]) g[i][j][m[i]+mm][0]=max(g[i][j][m[i]+mm][0],f[i+1][p-1]+g[p][j][mm][0]); } for(int p=j-1;p>=i;p--){ if(c[j]==c[p]) g[i][j][m[j]+mm][1]=max(g[i][j][m[j]+mm][1],f[p+1][j-1]+g[i][p][mm][1]); } } for(int p=i;p<j;p++){ if(!(c[i-1]==c[p+1] && c[p]==c[j+1])) f[i][j]=max(f[i][j],f[i][p]+f[p+1][j]); } if(c[i]==c[j]){ for(int p=i;p<j;p++){ for(int m1=1;m1<K;m1++){ for(int m2=1;m2<K;m2++){ f[i][j]=max(f[i][j],g[i][p][m1][0]+g[p+1][j][m2][1]+P[m1+m2]); } } } } } } cout<<f[1][n]<<endl; return 0; }