求助关于时间复杂度
  • 板块P9688 Colo.
  • 楼主hysbzdkf
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/6 09:28
  • 上次更新2023/11/2 15:20:54
查看原帖
求助关于时间复杂度
757869
hysbzdkf楼主2023/10/6 09:28

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

*/
2023/10/6 09:28
加载中...