一道区间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\) 个方块一起消掉,此时

\[f_{i,j,k}=f_{i,j-1,0}+(k+1)^2
\]

二是在区间 \([i,j-1]\) 之间选一个与 \(j\) 颜色相同的方块 \(p\) ,将 \([p+1,j-1]\) 消掉,使得 \(p\) 和 \(j\) 相邻,再消掉全部,此时

\[f_{i,j,k}=f_{p+1,j-1,0}+f_{i,p,k+1}
\]

最后,就是要注意转移时的顺序, \(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)的更多相关文章

  1. [Luogu2135] 方块消除【区间Dp】

    Online Judge:P2135 方块消除(这题不用预处理) Label:区间Dp 题目描述 Jimmy最近迷上了一款叫做方块消除的游戏.游戏规则如下:n个带颜色方格排成一列,相同颜色的方块连成一 ...

  2. 「THUSC 2016」成绩单 & 方块消除 (区间dp)

    成绩单 $f[l][r][mi][mx]$表示从l到r发到还没发的部分的最小值为mi最大值为mx时的最小代价. $f[l][r][0][0]$表示从l到r全部发完的代价. 自己写的无脑dp,枚举中转点 ...

  3. UVA10559 方块消除 Blocks 题解

    设g[i][j][k]为消去区间[i,j]中的方块,只留下k个与a[i]颜色相同的方块的最大价值,f[i][j]为将[i,j]中所有方块消去的价值,转移自己yy一下即可. 为什么这样是对的?因为对于一 ...

  4. $UVA10559\ Blocks\ $区间$dp$

    \(Des\) • 有一排数量为N的方块,每次可以把连续的相同颜色的区间消除,得到分数为 区间长度的平方,然后左右两边连在一起,问最大分数为多少. • n<=1 \(Sol\) 正解状态设得奇奇 ...

  5. UVA10559&POJ1390 Blocks 区间DP

    题目传送门:http://poj.org/problem?id=1390 题意:给出一个长为$N$的串,可以每次消除颜色相同的一段并获得其长度平方的分数,求最大分数.数据组数$\leq 15$,$N ...

  6. UVA 10559 Blocks(区间DP&&递推)

    题目大意:给你玩一个一维版的消灭星星,得分是当前消去的区间的长度的平方,求最大得分. 现在分析一下题目 因为得分是长度的平方,不能直接累加,所以在计算得分时需要考虑前一个状态所消去的长度,仅用dp[l ...

  7. UVA 10559 Blocks —— 区间DP

    题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][ ...

  8. 『Blocks 区间dp』

    Blocks Description Some of you may have played a game called 'Blocks'. There are n blocks in a row, ...

  9. POJ1390 Blocks (区间DP)

    题目链接:POJ 1390.Blocks 题意: 有n个方块排成一列,每个方块有颜色即1到n的一个值,每次操作可以把一段相同颜色的方块拿走,长度为k,则获得的分数为 \(k\times k\),求可获 ...

随机推荐

  1. MYSQL 命令导出事件、存储过程、触发器

    普通导出某个数据库 mysqldump -u username -p passowrd databasename > file.sql 顺便导出事件 使用 –events 参数 mysqldum ...

  2. np.unique( )的用法

    该函数是去除数组中的重复数字,并进行排序之后输出. 换句话,我想从一个图片选取 1000个不同的点,随机采点经常遇到相同的点,造成重复.np.unique就是用来解决这个问题

  3. jq Sortable的使用

    本文仅做翻译记录查看,GitHub原项目地址: https://github.com/RubaXa/Sortable/ ,建议将Sortable.js下载到本地,GitHub上的例子在复制到本地运行, ...

  4. MYSQL高可用集群架构-MHA架构

    1  MHA简介:MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司 ...

  5. CF1248E Queue in the Train

    题目链接 problem 火车上的一列人要去排队接水.每个人都会在某个特定的时刻口渴.口渴之后他要去排队接水,如果他前面的座位有人已经在排队或者正在接水,那么他就不会去排队.否则他就会去排队.每个人接 ...

  6. python-pandas读取mongodb、读取csv文件

    续上一篇博客(‘’selenium爬取NBA并将数据存储到MongoDB‘)https://www.cnblogs.com/lutt/p/10810581.html 本篇的内容是将存储到mongo的数 ...

  7. Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]

    科学计数法使用e标识数值,将科学计算学转化为数字的思路:按e右边的数字移动小数点位数.e右边的数字如果是负数,则向左移动小数点.示例如下: 1.2345678e2 = 123.45678 1.2345 ...

  8. Octave Convolution详解

    前言 Octave Convolution来自于这篇论文<Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural ...

  9. 【LOJ#575】【LNR#2】不等关系(容斥,动态规划,分治FFT)

    [LOJ#575][LNR#2]不等关系(容斥,动态规划,分治FFT) 题面 LOJ 题解 一个暴力\(dp\),设\(f[i][j]\)表示考虑完了前\(i\)个位置,其中最后一个数在前面所有数中排 ...

  10. 使用pytorch时所遇到的问题总结

    使用pytorch时所遇到的问题总结 1.ubuntu vscode切换虚拟环境 在ubuntu系统上,配置工作区文件夹所使用的虚拟环境.之前笔者误以为只需要在vscode内置的终端上将虚拟环境切换过 ...