记录编号 602707 评测结果 AAAAAAAAAA
题目名称 2034.[Tyvj]方块消除 最终得分 100
用户昵称 Gravatar对立猫猫对立 是否通过 通过
代码语言 C++ 运行时间 0.985 s
提交时间 2025-07-05 15:30:05 内存使用 10.50 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N = 210;
int a[N], b[N], c[N];
long long f[N][N][N];

int main()
{
    int n; scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    int m = 0;
    for(int i = 1; i <= n; ++i)
        if(a[i] != a[i - 1]) b[++m] = a[i], c[m] = 1;
        else ++c[m];
    for(int i = 1; i <= m; ++i)
        for(int k = 0; k <= n; ++k)
            f[i][i][k] = (c[i] + k) * (c[i] + k);
    for(int len = 2; len <= m; ++len)
        for(int l = 1; l <= m - len + 1; ++l)
        {
            int r = l + len - 1;
            for(int k = 0; k <= n; ++k)
            {
                f[l][r][k] = f[l][r - 1][0] + (c[r] + k) * (c[r] + k);
                for(int x = l; x < r; ++x)
                    if(b[x] == b[r])
                        f[l][r][k] = max(f[l][r][k], f[l][x][c[r] + k] + f[x + 1][r - 1][0]);
            }
        }
    printf("%lld\n", f[1][m][0]);
    return 0;
}