【警示后人】如果你全WA
查看原帖
【警示后人】如果你全WA
349824
WsW_花逝爆零人楼主2025/8/1 01:11

以下两种转移是不同的,第一份正确,第二份错误。

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 时,第二份出错。因为转移时我们认为,对于同一个数字,当前这一个和上一个之间隔了一些不同的数字。我们在计算贡献的时候,拆成了 1lstai+11\sim lst_{a_i}+1lstai+1ilst_{a_i}+1\sim 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];
2025/8/1 01:11
加载中...