RT, 40 pts , record
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[501],num,d[501],f[501],g[501],ans,zans;
bool b[501],e[501][501];
struct node{
int l,r;
}c[501];
void dfs(int lo){
// for(int i=1;i<=lo;i++)
// cout<<f[i]<<" ";
// cout<<endl;
if(lo==m&&lo<=num){
ans=max(ans,zans);
// for(int i=1;i<=lo;i++)
// cout<<f[i]<<" ";
// cout<<endl;
return ;
}
bool fla=1;
for(int i=1;i<=num;i++){
bool flag=1;
for(int j=1;j<=lo;j++) {
// cout<<f[j]<<" "<<d[i]<<endl;
if(e[f[j]][d[i]]==1)
flag=0;
}
if(flag==0)continue;
fla=0;
lo++;
f[lo]=d[i];
// cout<<d[i]<<" ";
// cout<<d[i]<<" ";
zans+=g[d[i]];
// cout<<zans<<endl;
dfs(lo);
zans-=g[d[i]];
f[lo]=0;
lo--;
}
if(fla==1){
if(lo==m) ans=max(ans,zans);
// cout<<ans<<endl;
return ;
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
if(!b[a[i]]){//没有出现过
b[a[i]]=1;
num++;//种类
d[num]=a[i];//将颜色加入
c[a[i]].l=i;//左端点初始化
c[a[i]].r=i;
}
else
c[a[i]].r=i;//更新右端点
}
for(int i=1;i<=n;i++)
cin>>g[i];
for(int i=1;i<=num;i++)
e[d[i]][d[i]]=1;
for(int i=1;i<=num;i++){
for(int j=1;j<c[d[i]].l;j++){
if(a[j]>d[i]){
e[d[i]][a[j]]=1;//加入黑名单
// cout<<d[i]<<" "<<a[j]<<endl;
}
}
for(int j=c[d[i]].l+1;j<c[d[i]].r;j++){
e[d[i]][a[j]]=1;//加入黑名单
// cout<<d[i]<<" "<<a[j]<<endl;
}
for(int j=c[d[i]].r+1;j<=n;j++){
if(a[j]<d[i]){
e[d[i]][a[j]]=1;//加入黑名单
// cout<<d[i]<<" "<<a[j]<<endl;
}
}
}
dfs(0);
if(ans==0)
cout<<-1<<endl;
else
cout<<ans<<endl;
return 0;
}
/*
5 5
1 2 4 4 5
3 4 5 2 1
*/