$ POJ1390~Blocks: $ (很难想的区间DP)



$ solution: $

很好的一道题目。看起来似乎很简单,当时一直认为可以用二维区间DP来完成,转移 $ n^3 $ 。 后来发现如果用二维表示当前状态,转移可以说无路可走。因为可能存在原本不相邻的多个区间最后是一起消除的。所以我们需要保留下来某一段重复的区间做为我们的一个新的维度。

或者说,(存在原本不相邻的多个区间最后是一起消除的)这个过程也是可以从后向前消除,只是保留最后的一段相同区间,先消掉它前面的区间,比如12131这个数列,我们可以先将3消掉,使两个1到一块来:1211,然后再消掉2,使剩下的一个1也合拢来:111。于是我们考虑在原有维度上加一维,它保留最后一段区间的信息,但是我们就需要同时记录颜色和长度,这不是一个维度能干的事,所以我们换一种方式:

注:出于贪心,也为了方便做题,我们先将数列里连续相同的一段合并,用 $ b[i] $ 表示其长度

设 $ f[i][j][k] $ 表示区间 $ [i,j] $ 并且后面有连续k个格子的颜色和 $ j $ 号格子相同。这时,转移就会相对容易些:

  1. 将后面的连续k个格子的颜色和 $ j $ 号格子合并: $ f[i][j][k]=f[i][j-1][0]+(b[j]+k)^2 $
  2. 枚举 $ [i,j) $ 内的一个格子 $ x $ ,这个格子需与 $ j $ 号格子颜色一致,然后消掉这个格子与 $ j $ 号格子之间的格子: $ f[i][j][k]=f[i][x][b[j]+k+1]+f[x+1][j-1][0] $

然后我们发现这个题目转移只涉及了 $ f $ 数组,所以我们可以用记忆化搜索(递归)处理。



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define rg register int using namespace std; int t,tt,n,m;
int a[205],b[205];
int f[205][205][205];
int d[205][205][205]; inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar()))if(ch=='-')sign=1;
while(isdigit(ch))res=res*10+(ch^48),ch=getchar();
if(sign)return -res; else return res;
} inline int dfs(int x,int y,int z){
if(y<x)return 0; if(x==y)return (b[x]+z)*(b[x]+z);
if(d[x][y][z]==tt)return f[x][y][z];
f[x][y][z]=dfs(x,y-1,0)+(z+b[y])*(z+b[y]);
for(rg i=x;i<y;++i){
if(a[i]!=a[y])continue;
f[x][y][z]=max(f[x][y][z],dfs(x,i,b[y]+z)+dfs(i+1,y-1,0));
}return d[x][y][z]=tt,f[x][y][z];
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
t=qr();
while(++tt<=t){
n=qr(); m=0;
for(rg i=1;i<=n;++i,++b[m])
if((a[m+1]=qr())!=a[m])++m,b[m]=0;
printf("Case %d: %d\n",tt,dfs(1,m,0));
}
return 0;
}

POJ-1390-Blocks (复杂区间DP)的更多相关文章

  1. POJ 1390 Blocks(记忆化搜索+dp)

    POJ 1390 Blocks 砌块 时限:5000 MS   内存限制:65536K 提交材料共计: 6204   接受: 2563 描述 你们中的一些人可能玩过一个叫做“积木”的游戏.一行有n个块 ...

  2. poj 1390 Blocks

    poj 1390 Blocks 题意 一排带有颜色的砖块,每一个可以消除相同颜色的砖块,,每一次可以到块数k的平方分数.问怎么消能使分数最大.. 题解 此题在徐源盛<对一类动态规划问题的研究&g ...

  3. Blocks题解(区间dp)

    Blocks题解 区间dp 阅读体验...https://zybuluo.com/Junlier/note/1289712 很好的一道区间dp的题目(别问我怎么想到的) dp状态 其实这个题最难的地方 ...

  4. POJ 1390 Blocks(区间DP)

    Blocks [题目链接]Blocks [题目类型]区间DP &题意: 给定n个不同颜色的盒子,连续的相同颜色的k个盒子可以拿走,权值为k*k,求把所有盒子拿完的最大权值 &题解: 这 ...

  5. POJ 1390 Blocks (区间DP) 题解

    题意 t组数据,每组数据有n个方块,给出它们的颜色,每次消去的得分为相同颜色块个数的平方(要求连续),求最大得分. 首先看到这题我们发现我们要把大块尽可能放在一起才会有最大收益,我们要将相同颜色块合在 ...

  6. POJ 1390 Blocks(DP + 思维)题解

    题意:有一排颜色的球,每次选择一个球消去,那么这个球所在的同颜色的整段都消去(和消消乐同理),若消去k个,那么得分k*k,问你消完所有球最大得分 思路:显然这里我们直接用二位数组设区间DP行不通,我们 ...

  7. POJ - 3280Cheapest Palindrome-经典区间DP

    POJ - 3280 Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & ...

  8. poj 2955 括号匹配 区间dp

    Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6033   Accepted: 3220 Descript ...

  9. 【Uva10559】Blocks(区间DP)

    Description 题意:有一排数量为N的方块,每次可以把连续的相同颜色的区间消除,得到分数为区间长度的平方,然后左右两边连在一起,问最大分数为多少. \(1\leq N\leq200\) Sol ...

  10. POJ 3280 Cheapest Palindrome (区间DP) 经典

    <题目链接> 题目大意: 一个由小写字母组成的字符串,给出字符的种类,以及字符串的长度,再给出添加每个字符和删除每个字符的代价,问你要使这个字符串变成回文串的最小代价. 解题分析: 一道区 ...

随机推荐

  1. 前端开发学习笔记 - 1. Node.JS安装笔记

    Node.JS安装笔记 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an ...

  2. InfluxDB安装使用

    influxdb简介   启动步骤 服务启停:sudo service influxdb start/stop/restart 安装过程: 1.增加yum源 cat <<EOF | sud ...

  3. Matlab 中 函数circshift()的用法

    a = [ ; ; ]; b = [- - -; - - -;- - -]; c = [ ; ; ]; Hist(:,:,) = a; Hist(:,:,) = b; Hist(:,:,) = c; ...

  4. Flask中的路由配置

    在Flask中也同样有django中的路由配置只不过没有djngo那么严格主要的参数有一下六个记住常用的就可以了 1.endpoint   反向生成url地址标志,默认视图函数名 2.methods ...

  5. 二十四、python中sys模块

    '''1.sys.argv:命令行参数List,第一个元素是程序本身路径''' import sys print (sys.argv)-------------------------------[' ...

  6. linux设置开机启动程序?

    /etc/rc.d/init.d 是 /etc/init.d的目标链接. 如果/etc/rc.d下面没有 rc.local脚本文件, 则需要 手动创建: 而 /etc/bashrc 是在登陆bash ...

  7. mkdir: 无法创建目录"kk": 只读文件系统

    创建文件提示 root@hap1:/test>mkdir kk mkdir: 无法创建目录"kk": 只读文件系统 root@hap1:/test>mount .... ...

  8. spring包

    下载的spring包中文件及各种包众多,在项目中往往只有部分是我们必须的,如果不清楚什么时候需要什么包的话,看看下面就知道了. aspectj目录 下是在Spring框架下使用aspectj的源代码和 ...

  9. 剑指offer--day03

    1.1题目:斐波那契数列:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 1.2解题思路:斐波那契数列公式为: 这道题递归很好写 ...

  10. [2019杭电多校第八场][hdu6667]Roundgod and Milk Tea

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6667 题目大意是说n个班级,每个班级有ai人和bi杯茶,每个人只能喝其他班的茶并且只能喝一杯.问最多有 ...