提交时间:2024-11-27 21:00:32
运行 ID: 35141
#include<bits/stdc++.h> #define int long long #define doub long double #define PII pair<int,int> #define fir first #define sec second #define mp make_pair #define endl '\n' using namespace std; inline void Chmax(int &x,int y){x=max(x,y);} const int N=207; const int MaxK=17; const int INF=1e17; int n,k,w; int f[N][N]; int g[N][N][MaxK][2]; int c[N],m[N],p[N]; signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); for(int i=0;i<N;i++)for(int j=0;j<N;j++)f[i][j]=-INF; for(int i=0;i<N;i++)for(int j=0;j<N;j++)for(int t=0;t<MaxK;t++)g[i][j][t][0]=g[i][j][t][1]=-INF; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); freopen("1.out","w",stdout); #endif 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<=(k-1<<1);i++)cin>>p[i]; for(int i=1;i<k;i++)p[i]=p[k]-(k-i)*w; 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; for(int Len=2;Len<=n;++Len){ for(int l=1;l<=n-Len+1;++l){ int r=l+Len-1; //g[l][r][m][0] Chmax(g[l][r][m[l]][0],f[l+1][r]); for(int M=m[l]+1;M<k;++M){ for(int t=l+1;t<=r;t++){ if(c[l]==c[t])Chmax(g[l][r][M][0],f[l+1][t-1]+g[t][r][M-m[l]][0]); } } //g[l][r][m][1] Chmax(g[l][r][m[r]][1],f[l][r-1]); for(int M=m[r]+1;M<k;++M){ for(int t=r-1;t>=l;t--){ if(c[t]==c[r])Chmax(g[l][r][M][1],f[t+1][r-1]+g[l][t][M-m[r]][1]); } } //f[l][r] if(c[l]==c[r]){ for(int t=l;t<r;t++){ for(int i=1;i<k;i++) for(int j=1;j<k;j++)Chmax(f[l][r],g[l][t][i][0]+g[t+1][r][j][1]+p[i+j]); } } for(int t=l;t<r;t++){ bool FLG=(c[t]!=c[r+1])||(c[t+1]!=c[l-1]); if(FLG)Chmax(f[l][r],f[l][t]+f[t+1][r]); } } } // for(int i=1;i<=n;i++){for(int j=i;j<=n;j++)cout<<f[i][j]<<" ";cout<<endl;} cout<<f[1][n]<<endl; cout.flush(); return 0; }