请求添加hack
查看原帖
请求添加hack
945101
fuyiming09楼主2024/11/1 14:23

我脑残打错但还是过了民间数据

#include <bits/stdc++.h>
using namespace std;
long long t,n,a[200005],b[1000006],c[200005],dp[200005][2];
int main(){
	//freopen("color.in","r",stdin);
	//freopen("color.out","w",stdout);
	scanf("%lld",&t);
	for(;t;t--){
		scanf("%lld",&n);
		for(long long i=1;i<=n;i++){
			scanf("%lld",&a[i]);
			b[a[i]]=0;
			c[i]=c[i-1];
			if(a[i]==a[i-1])
				c[i]+=a[i];
		}
		for(long long i=1;i<=n;i++){
			dp[i][0]=dp[i][1]=max(dp[i-1][0],dp[i-1][1]);
			if(a[i]==a[i-1])
				dp[i][0]+=a[i];
			if(b[a[i]])
				dp[i][1]=max(dp[i][1],dp[b[a[i]]][1]+c[i-1]-c[b[a[i]]]+a[i]);
			if(!b[a[i]]||dp[i][1]>dp[b[a[i-1]]][1])
				b[a[i-1]]=i;
		}
		printf("%lld\n",max(dp[n][0],dp[n][1]));
	}
	return 0;
}

是否改变"b[a[i-1]]"的值的判断有误 改完是这样的:

#include <bits/stdc++.h>
using namespace std;
long long t,n,a[200005],b[1000006],c[200005],dp[200005][2];
int main(){
	//freopen("color.in","r",stdin);
	//freopen("color.out","w",stdout);
	scanf("%lld",&t);
	for(;t;t--){
		scanf("%lld",&n);
		for(long long i=1;i<=n;i++){
			scanf("%lld",&a[i]);
			b[a[i]]=0;
			c[i]=c[i-1];
			if(a[i]==a[i-1])
				c[i]+=a[i];
		}
		for(long long i=1;i<=n;i++){
			dp[i][0]=dp[i][1]=max(dp[i-1][0],dp[i-1][1]);
			if(a[i]==a[i-1])
				dp[i][0]+=a[i];
			if(b[a[i]])
				dp[i][1]=max(dp[i][1],dp[b[a[i]]][1]+c[i-1]-c[b[a[i]]]+a[i]);
			if(!b[a[i]]||dp[i][1]>dp[b[a[i-1]]][1]+c[i]-c[b[a[i-1]]])
				b[a[i-1]]=i;
		}
		printf("%lld\n",max(dp[n][0],dp[n][1]));
	}
	return 0;
}
2024/11/1 14:23
加载中...