【POJ-1390】Blocks 区间DP
Blocks
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 5252 | Accepted: 2165 |
Description
The corresponding picture will be as shown below:

Figure 1
If some adjacent boxes are all of the same color, and both the box to its left(if it exists) and its right(if it exists) are of some other color, we call it a 'box segment'. There are 4 box segments. That is: gold, silver, bronze, gold. There are 1, 4, 3, 1 box(es) in the segments respectively.
Every time, you can click a box, then the whole segment containing that box DISAPPEARS. If that segment is composed of k boxes, you will get k*k points. for example, if you click on a silver box, the silver segment disappears, you got 4*4=16 points.
Now let's look at the picture below:
Figure 2
The first one is OPTIMAL.
Find the highest score you can get, given an initial state of this game.
Input
Output
Sample Input
2
9
1 2 2 2 2 3 3 3 1
1
1
Sample Output
Case 1: 29
Case 2: 1
Source
Solution
lrj出的题好劲啊......写的TA爷的做法
一个比较厉害的状态$f[l][r][k]$表示当$a[l]==a[r]$时,将$l~r$这个整段玩到还剩连续的$k$个$a[l]/a[r]$色的块时得到的最大的值。
但是单靠这个是不足以转移的,
另一个状态$g[l][r]$表示,不管以什么方法,删光$l~r$这段的得到的最大的值。
然后进行区间DP,显然要枚举区间,枚举断点,转移就是;
$$f[l][r][k]=max(f[l][r][k],f[l][r][k-1]+g[k'-1][r-1]);$$
这个转移就是把区间$l~r$中花式删掉$k'~r-1$这段,剩下的组成$k$个的最大方案。
$$g[l][r]=max(g[l][r],f[l][r][k]+k*k,g[l][k']+g[k'+1][r]);$$
这个转移比较显然..
然后这样转移之后,显然$f[l][r][0]=g[l][r]$.
答案就是$f[1][N][0]/g[1][N]$,时间复杂度是$<=O(N^4)$的,而且在正常的数据下表现非常优秀。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
int T,N,a[],f[][][],g[][],t,cnt[][];
int main()
{
T=read();
while (T--)
{
N=read();
for (int i=; i<=N; i++) a[i]=read();
memset(cnt,,sizeof(cnt));
for (int i=; i<=N; i++)
for (int j=i+; j<=N; j++)
if (a[i]==a[j])
for (int k=i; k<=j; k++)
if (a[k]==a[i]) cnt[i][j]++;
memset(f,,sizeof(f)); memset(g,,sizeof(g));
for (int i=; i<=N; i++) g[i][i]=f[i][i][]=,f[i][i][]=;
for (int len=; len<=N; len++)
for (int l=; l+len-<=N; l++)
{
int r=l+len-;
for (int i=; i<=cnt[l][r]; i++)
{
for (int j=l; j<r; j++)
f[l][r][i]=max(f[l][r][i],f[l][j][i-]+g[j+][r-]);
g[l][r]=max(g[l][r],f[l][r][i]+i*i);
}
for (int i=l; i<r; i++) g[l][r]=max(g[l][r],g[l][i]+g[i+][r]);
f[l][r][]=g[l][r];
}
printf("Case %d: %d\n",++t,f[][N][]);
}
return ;
}
【POJ-1390】Blocks 区间DP的更多相关文章
- POJ 1390 Blocks(区间DP)
Blocks [题目链接]Blocks [题目类型]区间DP &题意: 给定n个不同颜色的盒子,连续的相同颜色的k个盒子可以拿走,权值为k*k,求把所有盒子拿完的最大权值 &题解: 这 ...
- POJ 1390 Blocks (区间DP) 题解
题意 t组数据,每组数据有n个方块,给出它们的颜色,每次消去的得分为相同颜色块个数的平方(要求连续),求最大得分. 首先看到这题我们发现我们要把大块尽可能放在一起才会有最大收益,我们要将相同颜色块合在 ...
- POJ 1390 Blocks(DP + 思维)题解
题意:有一排颜色的球,每次选择一个球消去,那么这个球所在的同颜色的整段都消去(和消消乐同理),若消去k个,那么得分k*k,问你消完所有球最大得分 思路:显然这里我们直接用二位数组设区间DP行不通,我们 ...
- POJ 1390 Blocks(记忆化搜索+dp)
POJ 1390 Blocks 砌块 时限:5000 MS 内存限制:65536K 提交材料共计: 6204 接受: 2563 描述 你们中的一些人可能玩过一个叫做“积木”的游戏.一行有n个块 ...
- POJ1390 Blocks (区间DP)
题目链接:POJ 1390.Blocks 题意: 有n个方块排成一列,每个方块有颜色即1到n的一个值,每次操作可以把一段相同颜色的方块拿走,长度为k,则获得的分数为 \(k\times k\),求可获 ...
- poj 1390 Blocks
poj 1390 Blocks 题意 一排带有颜色的砖块,每一个可以消除相同颜色的砖块,,每一次可以到块数k的平方分数.问怎么消能使分数最大.. 题解 此题在徐源盛<对一类动态规划问题的研究&g ...
- POJ 2995 Brackets 区间DP
POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...
- UVA10559&POJ1390 Blocks 区间DP
题目传送门:http://poj.org/problem?id=1390 题意:给出一个长为$N$的串,可以每次消除颜色相同的一段并获得其长度平方的分数,求最大分数.数据组数$\leq 15$,$N ...
- POJ 1179 - Polygon - [区间DP]
题目链接:http://poj.org/problem?id=1179 Time Limit: 1000MS Memory Limit: 10000K Description Polygon is a ...
随机推荐
- windows 7下React Native环境配置
React Native 是 Facebook 推出的一个用 Java 语言就能同时编写 ios,android,以及后台的一项技术,它可以做到实时热更新 .FaceBook 也号称这们技术是 “Le ...
- 常见容易遗漏的html标签
<link href="favicon.ico" mce_href="/favicon.ico" rel="bookmark" typ ...
- 深入理解javascript选择器API系列第三篇——h5新增的3种selector方法
× 目录 [1]方法 [2]非实时 [3]缺陷 前面的话 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展.人们对jQuer ...
- SegmentControl 那些令人烦恼的事儿
每个人的曾经都很苦逼.我知道我很卑微,但我不曾放慢脚步,在这条路上至死不悔.愿与你同行. UISegmentControl 概述 UISegmentControl 是系统的段选择控件,具有简洁大方的外 ...
- Linux crontab定时器的使用
crontab参数: -u:帮助其他用户建立或移除工作排程 -l:查阅crontab的工作内容 -r:移除所有的crontab的工作内容 -e:编辑crontab文件 每项工作有六个字段: * * * ...
- 从零自学Hadoop(21):HBase数据模型相关操作下
阅读目录 序 变量 数据模型操作 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...
- MongoDB中的数据类型
mongoDB中存储的数据单元被称作文档.文档的格式与JSON很类似,只不过由于JSON表达的数据类型范围太小(null,boolean,numeric,string和object),mongoDB对 ...
- PriorityQueue和Queue的一种变体的实现
队列和优先队列是我们十分熟悉的数据结构.提供了所谓的“先进先出”功能,优先队列则按照某种规则“先进先出”.但是他们都没有提供:“固定大小的队列”和“固定大小的优先队列”的功能. 比如我们要实现:记录按 ...
- SVM一点心得体会
支持向量机的学习说是刚刚开始,又不合理,只能说隔了很长的时间再看,终于在分类这块的层面上有了新的认识. 总的来说,支持向量机分为线性支持向量机和非线性支持向量机,线性支持向量机又可以分为硬间隔最大化线 ...
- struts2中值栈
值栈中的两个逻辑部分: 1.属性context,为OGNLContext类型,实际为ActionContext对象的一个引用,本质是一个Map,里面存放的各种Map,如request,session, ...