提交时间:2024-11-26 16:16:52
运行 ID: 35081
#include<bits/stdc++.h> using namespace std; #define int long long int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=310,N=20,inf=1e9; int n,K,m,ans,c[MAXN],a[MAXN],p[MAXN],f[MAXN][MAXN],fl[MAXN][MAXN][N],fr[MAXN][MAXN][N]; void Max(int &x,int y){x=max(x,y);} void slv(){ memset(f,-0x3f,sizeof(f)),memset(fl,-0x3f,sizeof(fl)),memset(fr,-0x3f,sizeof(fr)); n=read(),K=read(),m=read(); for(int i=1;i<=n;i++)c[i]=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=K;i<=2*K-2;i++)p[i]=read(); for(int i=0;i<K;i++)p[i]=p[K]-(K-i)*m; for(int i=1;i<=n;i++)f[i][i]=p[a[i]],fl[i][i][a[i]]=fr[i][i][a[i]]=f[i][i-1]=0; for(int l=n;l>=1;l--){ for(int r=l;r<=n;r++){ Max(fl[l][r][a[l]],f[l+1][r]); Max(fr[l][r][a[r]],f[l][r-1]); for(int k=l+1;k<=r;k++) for(int p=1;p<K-a[l];p++) if(c[l]==c[k])Max(fl[l][r][p+a[l]],f[l+1][k-1]+fl[k][r][p]); for(int k=l;k<r;k++) for(int p=1;p<K-a[r];p++) if(c[k]==c[r])Max(fr[l][r][p+a[r]],f[k+1][r-1]+fr[l][k][p]); if(c[l]==c[r]){ for(int k=l;k<r;k++)for(int i=1;i<K;i++)for(int j=1;j<K;j++) Max(f[l][r],fl[l][k][i]+fr[k+1][r][j]+p[i+j]); } for(int k=l;k<r;k++) if(c[k]!=c[r+1]||c[k+1]!=c[l-1])Max(f[l][r],f[l][k]+f[k+1][r]); // cout<<l<<" "<<r<<":"<<f[l][r]<<'\n'; // for(int i=1;i<=K;i++)cout<<fl[l][r][i]<<" ";cout<<'\n'; // for(int i=1;i<=K;i++)cout<<fr[l][r][i]<<" ";cout<<'\n'; } } printf("%lld",f[1][n]); } signed main(){ //freopen("basketball.in","r",stdin);freopen("basketball.out","w",stdout); slv(); return 0; }