记录编号 |
185986 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[Tyvj]方块消除 |
最终得分 |
100 |
用户昵称 |
mikumikumi |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.399 s |
提交时间 |
2015-09-10 20:29:33 |
内存使用 |
35.64 MiB |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int N,A[210],f[210][210][210],tot=0,B[210];
int ans=0;
int t(int b)
{
return b*b;
}
int DP(int x,int y,int p)
{
if(y<x) return 0;
if(f[x][y][p]) return f[x][y][p];
if(x==y)
{
f[x][y][p]=t(B[x]+p);
return f[x][y][p];
}
f[x][y][p]=DP(x,y-1,0)+t(B[y]+p);
for(int i=x;i<y;i++)
{
if(A[i]==A[y])
f[x][y][p]=max(f[x][y][p],DP(x,i,p+B[y])+DP(i+1,y-1,0));
}
return f[x][y][p];
}
int main()
{
freopen("eliminate.in","r",stdin);
freopen("eliminate.out","w",stdout);
scanf("%d",&N);
int now=-1;
int a;
for(int i=1;i<=N;i++)
{
scanf("%d",&a);
if(a!=now) {tot++;now=a;A[tot]=a;}
B[tot]++;
}
//for(int i=1;i<=tot;i++) cout<<A[i]<<endl;
int ans=DP(1,tot,0);
printf("%d",ans);
return 0;
}