看了题解区大佬的思路,我对比了我考场代码。本蒟蒻有个疑问:
前后两个相邻的相同数字不是应该一定计入答案吗?那为什么要记录前缀和 s 数组在每次转移的时候答案加上 si−sl+1 呢?我的转移是直接 dpi=max(dpi−1,dpl+1+ai)。最后答案加上相邻且相同数对的答案就行了。
这是我考场代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define int long long
using namespace std;
const int N = 2e5 + 9;
const int M = 1e6 + 7;
int n;
int a[N];
int last[M];
int L[N];
int dp[N];
void solve() {
cin >> n;
memset(dp, 0, sizeof(dp));
memset(L, 0, sizeof(L));
memset(last, 0, sizeof(last));
for(int i = 1; i <= n; i ++) cin >> a[i];
int ans = 0;
for(int i = 1; i <= n; i ++) {
if(last[a[i]] != 0) {
if(last[a[i]] == i - 1) ans +=a[i];
else L[i] = last[a[i]];
}
last[a[i]] = i;
}
for(int i = 1; i <= n; i ++) {
dp[i] = dp[i - 1];
if(L[i] != 0) dp[i] = max(dp[i], dp[L[i] + 1] + a[i]);
}
cout << dp[n] + ans << endl;
}
signed main()
{
// freopen("color2.in", "r", stdin);
// freopen("color.out", "w", stdout);
int T;
cin >> T;
while(T --) solve();
return 0;
}
这份代码能通过大样例和洛谷数据,求大佬 HACK。