rt,不知道哪错了,样例过了
f[i][j]表示前i种颜色留了j种最大价值
求求了,哪错了……
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int ls[505],b[505],f[505][505],l[505],r[505];
bool vis[505];
struct node {
int l,r;
int v,s,id;
} a[505];
inline int read() {
int a=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if (c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
a=a*10+(c-'0');
c=getchar();
}
return f*a;
}
main() {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read(),m=read();
for(int i=1; i<=n; i++) {
ls[i]=read();
vis[ls[i]]=1,r[ls[i]]=i;
}
for(int i=n; i>=1; i--)
l[ls[i]]=i;
for(int i=1; i<=n; i++)b[i]=read();
int cnt=0;
for(int i=1; i<=n; i++)
if(vis[i]) {
a[++cnt].v=b[i];
a[cnt].id=i;
}
int ans=-1;
memset(f,-1,sizeof(f));
f[0][0]=0;
for(int i=1; i<=cnt; i++){
for(int j=1; j<=min(i,m); j++) {
f[i][j]=f[i-1][j];
for(int k=0; k<i; k++) {
if(l[a[i].id]<r[a[k].id]||f[k][j-1]==-1)continue;
f[i][j]=max(f[i][j],f[k][j-1]+a[i].v);
}
}
ans=max(ans,f[i][m]);
}
printf("%lld\n",ans);
return 0;
}