以下两种转移是不同的,第一份正确,第二份错误。
dp[i]=dp[i-1];
if(lst[a[i]])dp[i]=max(dp[i],a[i]+dp[lst[a[i]]+1]+sum[i]-sum[lst[a[i]]+1]);
if(lst[a[i]])dp[i]=max(dp[i-1],a[i]+dp[lst[a[i]]+1]+sum[i]-sum[lst[a[i]]+1]);
else dp[i]=dp[i-1]
原因:当 lst[a[i]]+1
等于 i
时,第二份出错。因为转移时我们认为,对于同一个数字,当前这一个和上一个之间隔了一些不同的数字。我们在计算贡献的时候,拆成了 1∼lstai+1 和 lstai+1∼i 这两个区间。实际上这样拆不太细致,可以更细致地分讨,如下:
if(lst[a[i]]){
if(lst[a[i]]==i-1)dp[i]=dp[i-1]+a[i];
else dp[i]=max(dp[i-1],a[i]+dp[lst[a[i]]+1]+sum[i]-sum[lst[a[i]]+1]);
}
else dp[i]=dp[i-1];