题目描述

Jimmy最近迷上了一款叫做方块消除的游戏。游戏规则如下:n个带颜色方格排成一列,相同颜色的方块连成一个区域(如果两个相邻方块颜色相同,则这两个方块属于同一区域)。为简化题目,将连起来的同一颜色方块的数目用一个数表示。

例如,9 122233331表示为

4 1 2 3 1

1 3 4 1

游戏时,你可以任选一个区域消去。设这个区域包含的方块数为x,则将得到x^2个分值。方块消去之后,其余的方块就会竖直落到底部或其他方块上。而且当有一列方块被完全消去时,其右边的所有方块就会向左移一格。Jimmy希望你能找出得最高分的最佳方案,你能帮助他吗?

输入输出格式

输入格式:

第一行包含一个整数m(1<=m<=50),表示同颜色方块区域的数目。第二行包含m个数,表示每个方块的颜色(1到m之间的整数)。

输出格式:

仅一个整数,即最高可能得分。

输入输出样例

输入样例#1:

4
1 2 3 1
1 3 4 1
输出样例#1:

29

Solution:

  吐槽:本题题面描述的实在是差~~

  题意其实很简单,直接忽略掉什么下落的情况(因为只有一排,消去后剩余的下落后还是一排),然后每消去一个区域就会得到区域所含个数$b[i]^2$的分值,并且消去该区域后会使本来与被消去区域相邻的两个区域相邻。

  样例:$122233331$,先消去$2$则$ans+=9$,再消去$3$则$ans+=16$,然后消去$1$则$ans+=4$,最后$ans=29$。

  不难想到本题就是个区间$DP$,由于多了一个连续区域的判断问题,所以在二维基础上加一维状态:

  $f[i][j][k]$表示消去第$i$到第$j$区域,最右边界的右边有$k$个没有被删时的最大价值。

  则初始状态$f[0][0][0]=0$,目标状态$f[1][n][0]$。

  不难想到状态转移方程:

  1、初值:$f[l][r][k]=f[l][r-1][0]+(b[r]+k)*(b[r]+k),k\in[0,s[n]-s[r]]$,其中$s$为前缀和数组,$s[n]-s[r]$表示第$r$到第$n$区域的方块个数。表示第$l$到第$r$区域右边界往右有$k$个方块没被删时,价值为第$l$到第$r-1$个区域删完的价值$+$第$r$个区域和其同类方块数和的平方。(注意初值的赋值不符合题目要求,只起到中间转移的作用,但并不影响结果的求解

  2、当$a[r]==a[k]$,$f[l][r][j]=Max(f[l][r][j],f[l][k][b[r]+j]+f[k+1][r-1][0]),k\in[l,r),j\in[0,s[n]-s[r]]$。看懂了上面的解释,这个就很容易了,自行理解。

  当然,其实状态转移时的初值赋值不符条件的问题可以解决,因为本题显然状态不能直接从上一个状态转移过来,此时考虑记搜就更方便直白,但是我强行转为循环就只能这样写了。

代码:

#include<bits/stdc++.h>
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
#define Max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=;
int n,a[N],b[N],f[N][N][N*],s[N];
int main(){
ios::sync_with_stdio();
cin>>n;
For(i,,n)cin>>a[i];
For(i,,n)cin>>b[i],s[i]=s[i-]+b[i];
For(i,,n-) For(l,,n)
if(l+i>n)break;
else{
int r=l+i;
For(k,,s[n]-s[r])f[l][r][k]=f[l][r-][]+(b[r]+k)*(b[r]+k);
Bor(k,l,r-) if(a[k]==a[r]) For(j,,s[n]-s[r])
f[l][r][j]=Max(f[l][r][j],f[l][k][b[r]+j]+f[k+][r-][]);
}
cout<<f[][n][];
return ;
}

P2135 方块消除的更多相关文章

  1. luogu P2135 方块消除 |dp

    题目描述 Jimmy最近迷上了一款叫做方块消除的游戏.游戏规则如下:n个带颜色方格排成一列,相同颜色的方块连成一个区域(如果两个相邻方块颜色相同,则这两个方块属于同一区域).为简化题目,将连起来的同一 ...

  2. 洛谷P2135 方块消除

    洛谷题目链接 动态规划(真毒瘤!) 变量声明: $val[i]$:表示第$i$块颜色 $num[i]$:表示第$i$块颜色数量 $sum[i]$:表示$num$的前缀和 我们设计状态$f[l][r][ ...

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

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

  4. [BNUZOJ1261][ACM][2016北理校赛]方块消除(栈,字符串)

    玩过方块消除游戏吗?现在规定当有两个或两个以上相邻且颜色相同的方块在一起的时候,它们就会产生消除反应.当存在多个消除反应同时产生时,最下的反应先执行.现在只给你其中一列,求最后剩下的方块结果. 输入要 ...

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

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

  6. 题解 Sue的小球/名次排序问题/方块消除/奥运物流

    Sue的小球 名次排序问题 方块消除 奥运物流 Sue的小球 题目大意 有 \(n\) 个小球在下落,初始位置 \((x_i,y_i)\),下落速度为 \(v_i\).你初始位置在 \(x_0\),速 ...

  7. poj 1390 Blocks (经典区间dp 方块消除)

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4250   Accepted: 1704 Descriptio ...

  8. [poj1390]Blocks(方块消除)

    题目大意:给定一序列,可点击某一位置消除与其相邻且相同的方块,得分为$len*len$,求最大得分. 解题关键:关键是状态的构造,首先离散化一下,令$dp[i][j][k]$表示序列$i-j$且后面有 ...

  9. UVA10559 方块消除 Blocks(区间dp)

    一道区间dp好题,在GZY的ppt里,同时在洛谷题解里看见了Itst orz. 题目大意 有n个带有颜色的方块,没消除一段长度为 \(x\) 的连续的相同颜色的方块可以得到 \(x^2\) 的分数,用 ...

随机推荐

  1. EBS并发管理器启动失败,系统暂挂,在重置计数器之前修复管理程序

    今天EBS安装补丁之后,因为停并发管理器的时候,因为关闭EBS应用时,并发管理器没有在前台停止,就直接停了应用服务,导致启动时,并发管理器直接起不来了,使用adcmctl.sh也没有办法启动. 进入系 ...

  2. hdu_1573_X问题 (分段之中国剩余

    求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … ...

  3. avalon ms-repeat avalon1

    工作原因要用到avalon二次开发, 但是看了下以前的avalon版本是1,现在大多数都是2版本了吧,,所以很多文档不好找,但是大多数还是好用的 ms-repeat 循环当前赋值的, ms-repea ...

  4. java动态返回一个大对象里多个小对象map返回,el表达式用c:set拼接

    基于堆内存,先把map放到返回值里 Map _map=new HashMap(); modelAndView.addObject("pledgeInsurance",_map);/ ...

  5. 正则表达式re.S的用法

    正则表达式re.S的用法 在Python的正则表达式中,有一个参数为re.S.它表示"."(不包含外侧双引号,下同)的作用扩展到整个字符串,包括"\n".看如下 ...

  6. Python的循环正确的操作使用方法详解

    要计算1+2+3,我们可以直接写表达式: >>> 1 + 2 + 3 6 要计算1+2+3+...+10,勉强也能写出来. 但是,要计算1+2+3+...+10000,直接写表达式就 ...

  7. 开放定址法——线性探测(Linear Probing)

    之前我们所采用的那种方法,也被称之为封闭定址法.每个桶单元里存的都是那些与这个桶地址比如K相冲突的词条.也就是说每个词条应该属于哪个桶所对应的列表,都是在事先已经注定的.经过一个确定的哈希函数,这些绿 ...

  8. POJ:3259-Wormholes(最短路判断负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 58153 Accepted: 21747 Descripti ...

  9. 15.2,redis发布订阅

    发布publish 订阅subscribe Redis 通过 PUBLISH . SUBSCRIBE 等命令实现了订阅与发布模式. 举例1: qq群的公告,单个发布者,多个收听者 发布/订阅 实验 发 ...

  10. css3心形 perspective transform

    CSS3挺有趣的,能实现不少动画,以下为娱乐内容 <!DOCTYPE html> <html> <head> <meta charset="UTF- ...