设g[i][j][k]为消去区间[i,j]中的方块,只留下k个与a[i]颜色相同的方块的最大价值,f[i][j]为将[i,j]中所有方块消去的价值,转移自己yy一下即可。

为什么这样是对的?因为对于一段区间[i,j]一定存在一种最优方案使得i位置上的方块被最后一次消去,确定了最后一次消去的那k个方块的位置就可以把问题转换成若干个子区间上的子问题来解决。

复杂度是\(O(n^4)\)的,但是能过。

具体见代码:

#include<bits/stdc++.h>
using namespace std;
#define N 207
#define ll long long
int g[N][N][N],f[N][N];
int last[N][N],a[N];
int main()
{
int n,t;
scanf("%d",&t);
for(int o=1;o<=t;o++)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(g,-0x3f,sizeof(g));
memset(f,0,sizeof(f));
for( int i=1;i<=n;i++)
{
memcpy(last[i],last[i-1],sizeof(last[i]));
last[i][a[i-1]]=i-1;
}
for(int i=n;i>=1;i--)
for(int j=i;j<=n;j++)
{
f[i][j]=max((g[i][j][1]=f[i+1][j])+1,f[i][j]);
for(int k=2;k<=n;k++)
{
int p=a[j]==a[i]?j:last[j][a[i]];
while(p!=i&&g[i][p-1][k-1]!=g[0][0][0])
{
g[i][j][k]=max(g[i][j][k],g[i][p-1][k-1]+f[p+1][j]);
p=last[p][a[i]];
}
f[i][j]=max(f[i][j],g[i][j][k]+k*k);
}
}
printf("Case %d: %d\n",o,f[1][n]);
}
return 0;
}

最新文章

  1. .NET:OrderBy和ThenBy
  2. mke2fs/mks.etc3/fstab/mount指令
  3. FreeMarker中List排序
  4. 【暑假】[数学]UVa 10375 Choose and divide
  5. LFS 中文版手册发布:如何打造自己的 Linux 发行版
  6. ASP.NET中如何实现负载均衡
  7. MySQL字段自增自减的SQL语句
  8. UVA - 10048 Audiophobia Floyd
  9. 【BZOJ 2673】[Wf2011]Chips Challenge
  10. CF76A.Gift [最小生成树]
  11. 口袋appnabcd
  12. vmware ubuntu硬盘空间不够用,空间扩展
  13. 跟随我在oracle学习php(16)
  14. SQL 对等发布
  15. Nginx详解二十:Nginx深度学习篇之HTTPS的原理和作用、配置及优化
  16. android -------- MVP+DataBinding 的使用
  17. python下载脚本
  18. Vue通过build打包后 打开index.html页面是空白的
  19. Vue.js与WdatePicker日历控件冲突问题的解决方案
  20. with上下文管理器

热门文章

  1. 【MySQL】MMM和MHA高可用架构
  2. 【转】C#各版本新增加功能
  3. 基于MicroPython结合ESP8266模块实现TCP通信(AT指令版)
  4. 用guava快速打造两级缓存能力
  5. DateTimeComparer
  6. 升级GCC
  7. 使用AspectCore实现AOP模式的Redis缓存
  8. mask-rcnn代码解读(五):mask_iou的计算
  9. E203 bypass buffer
  10. vue 开发系列(十) VUE 作用域插槽