该题乍一看和矩阵链乘非常类似,但是有一个不同之处就是该题能够拼接 。

  为了达到这个目的。我们不得不拓展维度d[i][j][k]。用一个k表示最右边拼接了k个和a[j]同样颜色的方块。

问题的关键在于拼接,当右边存在一个q < p 且 a[q] == q[j] && a[q] != a[q+1] 时,能够拼接。要注意,全部满足这个条件的q都应该递归求解,由于哪一部分拼接起来更好,是不一定的 。

细节见代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 205;
int t,n,d[maxn][maxn][maxn],a[maxn],Case = 0;
int dp(int i,int j,int k) {
int& ans = d[i][j][k];
if(ans >= 0) return ans;
ans = 0;
int q = j+1,p = j,u;
for(u=j;u>=i;u--) { //求解p
if(a[u]!=a[j]) break;
else p = u;
}
if(p == i) return ans = ((j-p+1+k)*(j-p+1+k));//递归边界
for(q=i;q<p;q++) { //求解q
if(a[q] == a[j] && a[q+1] != a[j])
ans = max(ans,dp(q+1,p-1,0) + dp(i,q,j-p+1+k) );//决策2
}
ans = max(ans,dp(i,p-1,0) + (j-p+1+k)*(j-p+1+k));//决策1
return ans;
} int main() {
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
memset(d,-1,sizeof(d));
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
printf("Case %d: %d\n",++Case,dp(1,n,0));
}
return 0;
}

最新文章

  1. base64与byte[]之间转换
  2. ORACLE之ASM概念
  3. 【CodeVS 2083】Cryptcowgraphy 解密牛语
  4. hdu 4007 暴力or线段树 ***
  5. php __set() __get() __isset() __unset()四个方法的应用
  6. html5 表单样式 表单验证1 2 3
  7. 从while(cin&gt;&gt;a)开始探讨cin
  8. 关于查询oracle in &gt;1000 的讨论
  9. Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)
  10. ListView使用自定义适配器的情况下实现适配器的控件点击事件执行Activity界面中的方法
  11. 发现一个可以在线运行JS代码的网站
  12. i++与++i的区别
  13. Ubuntu 12.04下安装ibus中文输入法
  14. android在桌面弹出一个窗口
  15. [Leetcode][Python]21: Merge Two Sorted Lists
  16. CentOS7 搭建Ambari-Server,安装Hadoop集群(一)
  17. python 函数enumerate(x,y)的用法
  18. 线程误区-join,wait(里边还是调用的wait)
  19. 实用ExtJS教程100例-005:自定义对话框Ext.MessageBox.show
  20. yum 安装nginx

热门文章

  1. 关于Echarts表格插件的使用
  2. Ubuntu 16.04安装mysql (连接)
  3. VIjos——V 1782 借教室 | | 洛谷——P1083 借教室
  4. 加快编译的技巧 &amp; mount及tmpfs
  5. android ActionBar的使用
  6. Java源代码之集合框架(图)
  7. 深入分析JavaWeb Item23 -- jsp自己定义标签开发入门
  8. 7.cocos精灵创建和绘制
  9. Deep Networks : Overview
  10. 【bzoj4864】神秘物质