一个疑问
查看原帖
一个疑问
1471648
Believe_in_Future楼主2024/10/28 20:41

看了题解区大佬的思路,我对比了我考场代码。本蒟蒻有个疑问:

前后两个相邻的相同数字不是应该一定计入答案吗?那为什么要记录前缀和 ss 数组在每次转移的时候答案加上 sisl+1s_i - s_{l+1} 呢?我的转移是直接 dpi=max(dpi1,dpl+1+ai)dp_i = max(dp_{i-1},dp_{l+1}+a_i)。最后答案加上相邻且相同数对的答案就行了。

这是我考场代码:

#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。

2024/10/28 20:41
加载中...