我脑残打错但还是过了民间数据
#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;
}