UVA10559 方块消除 Blocks(区间dp)
一道区间dp好题,在GZY的ppt里,同时在洛谷题解里看见了Itst orz。
题目大意
有n个带有颜色的方块,没消除一段长度为 \(x\) 的连续的相同颜色的方块可以得到 \(x^2\) 的分数,用一种最优的顺序消除所有方块使得得分最多。
Solution
一开始用的常规操作,设 \(f_{i,j}\) 表示区间 \([i,j]\) 的最大得分,然后发现转移的时候很麻烦,此时瞄了一下题解,发现神奇的设状态方法:
\(f_{i,j,k}\) 表示区间 \([i,j]\) 且右边有 \(k\) 个和 \(j\) 颜色相同的方块,合并所有这些方块的最大得分。
考虑转移,有两种情况,一是把最后 \(k+1\) 个方块一起消掉,此时
\]
二是在区间 \([i,j-1]\) 之间选一个与 \(j\) 颜色相同的方块 \(p\) ,将 \([p+1,j-1]\) 消掉,使得 \(p\) 和 \(j\) 相邻,再消掉全部,此时
\]
最后,就是要注意转移时的顺序, \(i\) 应该从大到小枚举,因为是从右边转移到左边。
Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define _FILE(x) freopen(x".in", "r", stdin); freopen(x".out", "w", stdout)
using namespace std;
const int maxn = 200 + 10;
int n, a[maxn], f[maxn][maxn][maxn], num[maxn];
int main()
{
#ifndef ONLINE_JUDGE
_FILE("a");
#endif
int T, kase = 0;
cin >> T;
while (T--) {
cin >> n;
memset(f, 0, sizeof(f));
memset(num, 0, sizeof(num));
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
if (a[i] == a[j])
++num[i];
for (int i = n; i >= 0; --i) {
for (int j = i; j <= n; ++j) {
for (int k = i; k < j; ++k)
if (a[j] == a[k]) {
for (int p = 0; p <= num[j]; ++p)
f[i][j][p] = max(f[i][j][p], f[k + 1][j - 1][0] + f[i][k][p + 1]);
}
for (int p = 0; p <= num[j]; ++p)
f[i][j][p] = max(f[i][j][p], f[i][j - 1][0] + (p + 1) * (p + 1));
}
}
printf("Case %d: %d\n", ++kase, f[1][n][0]);
}
return 0;
}
UVA10559 方块消除 Blocks(区间dp)的更多相关文章
- [Luogu2135] 方块消除【区间Dp】
Online Judge:P2135 方块消除(这题不用预处理) Label:区间Dp 题目描述 Jimmy最近迷上了一款叫做方块消除的游戏.游戏规则如下:n个带颜色方格排成一列,相同颜色的方块连成一 ...
- 「THUSC 2016」成绩单 & 方块消除 (区间dp)
成绩单 $f[l][r][mi][mx]$表示从l到r发到还没发的部分的最小值为mi最大值为mx时的最小代价. $f[l][r][0][0]$表示从l到r全部发完的代价. 自己写的无脑dp,枚举中转点 ...
- UVA10559 方块消除 Blocks 题解
设g[i][j][k]为消去区间[i,j]中的方块,只留下k个与a[i]颜色相同的方块的最大价值,f[i][j]为将[i,j]中所有方块消去的价值,转移自己yy一下即可. 为什么这样是对的?因为对于一 ...
- $UVA10559\ Blocks\ $区间$dp$
\(Des\) • 有一排数量为N的方块,每次可以把连续的相同颜色的区间消除,得到分数为 区间长度的平方,然后左右两边连在一起,问最大分数为多少. • n<=1 \(Sol\) 正解状态设得奇奇 ...
- UVA10559&POJ1390 Blocks 区间DP
题目传送门:http://poj.org/problem?id=1390 题意:给出一个长为$N$的串,可以每次消除颜色相同的一段并获得其长度平方的分数,求最大分数.数据组数$\leq 15$,$N ...
- UVA 10559 Blocks(区间DP&&递推)
题目大意:给你玩一个一维版的消灭星星,得分是当前消去的区间的长度的平方,求最大得分. 现在分析一下题目 因为得分是长度的平方,不能直接累加,所以在计算得分时需要考虑前一个状态所消去的长度,仅用dp[l ...
- UVA 10559 Blocks —— 区间DP
题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][ ...
- 『Blocks 区间dp』
Blocks Description Some of you may have played a game called 'Blocks'. There are n blocks in a row, ...
- POJ1390 Blocks (区间DP)
题目链接:POJ 1390.Blocks 题意: 有n个方块排成一列,每个方块有颜色即1到n的一个值,每次操作可以把一段相同颜色的方块拿走,长度为k,则获得的分数为 \(k\times k\),求可获 ...
随机推荐
- RabbitMQ入门及其几种工作模式
1.简介 MQ全程Message Queue,用于应用程序和应用程序间进行通信.RabbitMQ采用Erlang编写,实现了AMQP(高级消息队列)协议,跨平台,支持各种主流的操作系统和多种客户端. ...
- 8. java 面向对象
一.面向对象特征 1. 封装 方法就是一种封装 关键字private也是一种封装 封装就是讲一些逻辑细节信息隐藏起来,对于外界不可见:外界只需调用我即可: 一旦使用了private进行修饰,那么本类当 ...
- UVA 1473 Dome of Circus
https://cn.vjudge.net/problem/UVA-1473 题目 给出一些点,问包含这些点的最小圆锥(要求顶点在y轴,底面圆心在原点)的体积 题解 因为圆锥对称,所以可以把所有点旋转 ...
- acwing 70-72 剑指OFFER 二叉树相关
地址 https://www.acwing.com/problem/content/66/ https://www.acwing.com/problem/content/67/ https://www ...
- linux编程stat检测文件元数据信息
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sta ...
- DevExpress中TreeList树样式调整
DevExpress的TreeList默认是没有树状线的,修改TreeLineStyle属性无效,这对于Tree并不好看. 解决方案一 官方解释说对于DevExpress的标准主题是不支持TreeLi ...
- idea配置pyspark
默认python已经配好,并已经导入idea,只剩下pyspark的安装 1.解压spark-2.1.0-bin-hadoop2.7放入磁盘目录 D:\spark-2.1.0-bin-hadoop2. ...
- Vs Code 2019软件安装教程及常用的入门设置
小编认为VsCode是一款非常好用的编辑器,插件丰富,支持的语言种类非常多.我所使用VsCode主要打一些前端的代码,自己感觉very good. 点击运行. 按图所示操作. 安装教程很简单的,主要是 ...
- IT兄弟连 Java语法教程 流程控制语句 循环结构语句1
循环语句可以在满足循环条件的情况下,反复执行某一点代码,这段被重复执行的代码被称为循环体,当反复执行这个循环体时,需要在合适的时候把循环条件该为假,从而结束循环,否则循环将一直执行下去,形成死循环.循 ...
- SpringBoot开发案例之mail中文附件名字乱码
最近在开发一个邮件发送多附件的微服务,使用的是org.springframework.mail.javamail.JavaMailSender;包下面的JavaMailSender 但是发送出来的附件 ...