记录编号 |
602686 |
评测结果 |
AAAAAAAAAA |
题目名称 |
2034.[Tyvj]方块消除 |
最终得分 |
100 |
用户昵称 |
Hollow07 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.522 s |
提交时间 |
2025-07-05 14:49:44 |
内存使用 |
50.98 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n,x,cnt,a[210],b[210],y;
ll ans,f[210][210][210];
ll dfs(ll l,ll r,ll k){
if(l>r) return 0;
if(f[l][r][k]!=-1) return f[l][r][k];
ll res=dfs(l,r-1,0)+(a[r]+k)*(a[r]+k);
for(int m=l;m<r;m++){
if(b[m]==b[r]) res=max(res,dfs(l,m,a[r]+k)+dfs(m+1,r-1,0));
}
return f[l][r][k]=res;
}
int main(){
freopen("eliminate.in","r",stdin);
freopen("eliminate.out","w",stdout);
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
scanf("%lld",&n);
if(n==0){
printf("0");
return 0;
}
scanf("%lld",&y);
a[++cnt]=1;
b[cnt]=y;
for (int i=2;i<=n;i++){
scanf("%lld",&x);
if (x==y) a[cnt]++;
else{
a[++cnt]=1;
b[cnt]=x;
}
y=x;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=0;k<=n;k++){
f[i][j][k] = -1;
}
}
}
printf("%lld",dfs(1,cnt,0));
return 0;
}