萌新求优化,dp55pts
查看原帖
萌新求优化,dp55pts
1140231
ChangeYuAN楼主2024/10/13 12:17
#include <bits/stdc++.h>
using namespace std;
const int MAXLEN = 5e5 + 5;
vector<int> g[MAXLEN];
int n, a[MAXLEN], dp[2][MAXLEN], ans = 0;
bool p = true, q = true;

signed main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
		if (g[a[i]].size() != 0) {
			p = false;
		}
		if (a[i] < a[i - 1]) {
			q = false;
		}
		g[a[i]].push_back(i);
	}
	if (p) {
		printf("0");
		return 0;
	}
	if (q) {
		int ans = 0;
		for (int i = 2; i <= n; i++) {
			if (a[i] == a[i - 1] && a[i - 1] != a[i - 2])
				ans += 2;
		}
		printf("%d", ans);
		return 0;
	}
	dp[0][0] = dp[1][0] = -2;
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < g[a[i]].size(); j++) {
			dp[0][i] = max(dp[0][i], dp[1][g[a[i]][j]] + 2);
		}
		for (int j = i - 1; j >= 1; j--) {
			if (a[j] == a[i])
				continue;
			dp[1][i] = max(dp[1][i], dp[0][j]);
		}
		if (i == g[a[i]][0]) {
			dp[0][i] = 0;
		}
		ans = max(ans, dp[0][i]);
	}
	printf("%d", ans);
	return 0;
}
2024/10/13 12:17
加载中...