dp求助
  • 板块P9688 Colo.
  • 楼主CmathFrog
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/10/2 19:08
  • 上次更新2023/11/2 16:29:55
查看原帖
dp求助
769482
CmathFrog楼主2023/10/2 19:08
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=510,INF=0x7f7f7f7f7f7f7f7f;
int a[N],b[N],beg[N],last[N],cost[N],dp[N][N],sum,minn=INF;
vector<int> g[N];
signed main(){
	for(int i=1;i<N;i++) for(int j=1;j<N;j++) dp[i][j]=INF;
	int n,k;cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(!beg[a[i]]) beg[a[i]]=i;
		last[a[i]]=i;
	}
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=1;i<=n;i++) cost[a[i]]+=b[a[i]],sum+=b[a[i]];
	for(int i=1;i<=n;i++){
		if(!last[i]) continue;
		for(int j=1;j<i;j++) if(last[j]&&last[j]<beg[i]) g[i].push_back(j);
	}
	for(int i=1;i<=n;i++) if(last[i]) dp[1][i]=cost[i];
	for(int i=2;i<=n;i++){
		if(!last[i]) continue;
		for(int j=0;j<g[i].size();j++) for(int l=1;l<i;l++)
			if(dp[l][g[i][j]]!=INF) dp[l+1][i]=min(dp[l+1][i],dp[l][g[i][j]]+b[i]);
	}
	for(int i=1;i<=n;i++) if(last[i]&&dp[k][i]!=INF) minn=min(minn,dp[k][i]);
	if(minn==INF) cout<<-1<<endl;
	else cout<<sum-minn<<endl;
	return 0; 
}
2023/10/2 19:08
加载中...