30pts求助
查看原帖
30pts求助
975724
Sine_Func楼主2024/10/27 09:14

能够拿到n<=2000的分但是不能拿到n<=15的,很神奇

#include <bits/stdc++.h>
#define int long long
using namespace std;
int t, n, m, a[2010], f[2][2010][2010];
int real(int x) {
	return (x & 1);
}
signed main() {
	cin >> t;
	while (t--) {
		memset(f, 0, sizeof(f));
		memset(a, 0, sizeof(a));
		cin >> n;
		for (int i = 1; i <= n; i++)
			cin >> a[i];
		for (int i = 1; i < n; i++) {
			for (int j = 1; j < i; j++) { //染蓝 枚举红
				if (a[j] == a[i + 1])f[real(i + 1)][i + 1][i] = max(f[real(i + 1)][i + 1][i], f[real(i)][j][i] + a[i + 1]); //
				else f[real(i + 1)][i + 1][i] = max(f[real(i + 1)][i + 1][i], f[real(i)][j][i]);
				if (a[i] == a[i + 1])f[real(i + 1)][j][i + 1] = max(f[real(i + 1)][j][i + 1], f[real(i)][j][i] + a[i + 1]); //
				else f[real(i + 1)][j][i + 1] = max(f[real(i + 1)][j][i + 1], f[real(i)][j][i]);
				if (a[j] == a[i + 1])f[real(i + 1)][i][i + 1] = max(f[real(i + 1)][i][i + 1], f[real(i)][i][j] + a[i + 1]); //
				else f[real(i + 1)][i][i + 1] = max(f[real(i + 1)][i][i + 1], f[real(i)][i][j]);
				if (a[i] == a[i + 1])f[real(i + 1)][i + 1][j] = max(f[real(i + 1)][i + 1][j], f[real(i)][i][j] + a[i + 1]); //
				else f[real(i + 1)][i + 1][j] = max(f[real(i + 1)][i + 1][j], f[real(i)][i][j]);
			}
		}
		m = 0;
		int l = real(n);
		for (int i = 1; i < n; i++) {
			m = max(m, f[l][i][n]);
			m = max(m, f[l][n][i]);
		}
		cout << m << "\n";
	}
	return 0;
}
2024/10/27 09:14
加载中...