比赛 2025暑期集训第4场 评测结果 AWAAWWWWAW
题目名称 方块消除 最终得分 40
用户昵称 OTTF 运行时间 0.032 s
代码语言 C++ 内存使用 3.84 MiB
提交时间 2025-07-05 09:17:26
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <iostream>

using namespace std;

constexpr int N = 233;

int n;
int nums[N];
int fromLeft[N];
int fromRight[N];
int dp[N][N];

int main () {
	
	freopen ("eliminate.in" ,"r", stdin);
	freopen ("eliminate.out", "w", stdout);
	
	cin >> n;

	if (n == 0) {
		cout << 0 << endl;
		return 0;
	}

	for (int i = 1; i <= n; i++) {
		cin >> nums[i];
	}

	for (int i = 1; i <= n; i++) {
		fromRight[i] = (nums[i] == nums[i - 1] ? fromRight[i - 1] + 1 : 1);
	}
	for (int i = n; i >= 1; i--) {
		fromLeft[i] = (nums[i] == nums[i + 1] ? fromLeft[i + 1] + 1 : 1);
	}

	for (int len = 1; len <= n; len++) {
		for (int i = 1, j = i + len - 1; j <= n; i++, j++) {
			int fl = min (fromLeft[i], len);
			int fr = min (fromRight[j], len);

			if ((fl == len) && (fr == len)) {
				dp[i][j] = len * len;
			}
			else if (nums[i] == nums[j]) {
				dp[i][j] = (fl + fr) * (fl + fr) + dp[i + fl][j - fr];
			}
			else {
				dp[i][j] = fl * fl + fr * fr + dp[i + fl][j - fr];
			}
		}
	}

	cout << dp[1][n] << endl;

	return 0;
}