P9688 Colo. 题解
由于要求单调,肯定满足对于所有选择的颜色
直接枚举出现过的颜色,无交的按
时间复杂度:
赛时在连边时没判颜色编号调了很久。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define pb push_back
const int N=510;
const ll inf=1e18;
int n,m,k;
int a[N],b[N],L[N],R[N],deg[N];
ll f[N][N];
vector<int> e[N];
struct node{
int l,r,id;
friend bool operator<(node a,node b){
return a.l<b.l;
}
};
vector<node> vec;
queue<int> q;
void work(int x,int y){
if(vec[x].id<vec[y].id&&vec[x].r<vec[y].l)e[x].pb(y),deg[y]++;
}
int main(){
for(int i=0;i<N;i++)for(int j=1;j<N;j++)f[i][j]=-inf;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
if(!L[a[i]])L[a[i]]=i;
R[a[i]]=i;
}
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++)if(L[i])vec.pb((node){L[i],R[i],i});
sort(vec.begin(),vec.end());
m=vec.size();
for(int i=0;i<m;i++)for(int j=i+1;j<m;j++)work(i,j);
for(int i=0;i<m;i++)if(!deg[i])q.push(i),f[i][1]=b[vec[i].id];
while(!q.empty()){
int u=q.front();q.pop();
for(int v:e[u]){
for(int i=1;i<=k;i++)f[v][i]=max(f[v][i],f[u][i-1]+b[vec[v].id]);
if(!--deg[v])q.push(v);
}
}
ll ans=-inf;
for(int i=0;i<m;i++)ans=max(ans,f[i][k]);
cout<<(ans>=k?ans:-1)<<"\n";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏