subtask #3#4#5#11#13#14#15 #16#17#18#20没过 刚开始学dp,思路是参考(真的是参考)讨论版里大佬修改后的思路,可是明明基本一样了却还是过不了(dalao代码能过)
#include <bits/stdc++.h>
#define inf -1
using namespace std;
long long g[505][505]={0};
typedef struct{
long long begin;
long long last;
}edge;
edge bucket[505];
int main(void){
long long n,k,a[505],b[505],dp[505][505]={0},count;
cin>>n>>k;
for(int i=0;i<=n;i++){
bucket[i].begin =inf;
bucket[i].last =inf;
}
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(bucket[a[i]].begin ==inf)
{
bucket[a[i]].begin =i;
bucket[a[i]].last =i;
}
else {
bucket[a[i]].last =i;
}
}
for (int i=1;i<=n;i++)
{
cin>>b[i];
}
for(int i=1;i<=n;i++)
{
count=0;
if(bucket[i].begin ==inf)continue;
for(int j=1;j<i;j++)
{
if(bucket[j].begin ==inf)continue;
if(bucket[i].begin >bucket[j].last )
{
g[i][count]=j;
count++;
}
}
}
for(int i=1;i<=n;i++)
{
if(bucket[i].begin !=inf)
{
dp[1][i]=b[i];
}
}
for(int i=2;i<=k;i++)
{
for(int j=i;j<=n;j++)
{
if(bucket[i].begin !=inf && g[j][0]!=0)
{
for(int p=0;g[j][p]!=0;p++)
{
if(dp[i-1][g[j][p]] !=0)
{
dp[i][j]=max(dp[i][j],dp[i-1][g[j][p]]+b[j]);
}
}
}
}
}
long long maxf=0;
for(int i=1;i<=n;i++)
{
if(bucket[i].begin !=inf)
{
maxf=max(maxf,dp[k][i]);
}
}
if(maxf==0)maxf=-1;
cout<<maxf<<endl;
return 0;
}