10559 - Blocks(方块消除|DP)
2024-09-05 00:54:25
该题乍一看和矩阵链乘非常类似,但是有一个不同之处就是该题能够拼接 。
为了达到这个目的。我们不得不拓展维度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;
}
最新文章
- base64与byte[]之间转换
- ORACLE之ASM概念
- 【CodeVS 2083】Cryptcowgraphy 解密牛语
- hdu 4007 暴力or线段树 ***
- php __set() __get() __isset() __unset()四个方法的应用
- html5 表单样式 表单验证1 2 3
- 从while(cin>;>;a)开始探讨cin
- 关于查询oracle in >;1000 的讨论
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)
- ListView使用自定义适配器的情况下实现适配器的控件点击事件执行Activity界面中的方法
- 发现一个可以在线运行JS代码的网站
- i++与++i的区别
- Ubuntu 12.04下安装ibus中文输入法
- android在桌面弹出一个窗口
- [Leetcode][Python]21: Merge Two Sorted Lists
- CentOS7 搭建Ambari-Server,安装Hadoop集群(一)
- python 函数enumerate(x,y)的用法
- 线程误区-join,wait(里边还是调用的wait)
- 实用ExtJS教程100例-005:自定义对话框Ext.MessageBox.show
- yum 安装nginx