25分求助
  • 板块P9688 Colo.
  • 楼主xqc1368
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/3 00:28
  • 上次更新2023/11/2 16:25:21
查看原帖
25分求助
95848
xqc1368楼主2023/10/3 00:28

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;
}
2023/10/3 00:28
加载中...