P2135 方块消除

题目描述

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]]$。看懂了上面的解释,这个就很容易了,自行理解。

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

代码:

 1 #include<bits/stdc++.h>
 2 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
 3 #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
 4 #define Max(a,b) ((a)>(b)?(a):(b))
 5 using namespace std;
 6 const int N=51;
 7 int n,a[N],b[N],f[N][N][N*3],s[N];
 8 int main(){
 9     ios::sync_with_stdio(0);
10     cin>>n;
11     For(i,1,n)cin>>a[i];
12     For(i,1,n)cin>>b[i],s[i]=s[i-1]+b[i];
13     For(i,0,n-1) For(l,1,n)
14     if(l+i>n)break;
15     else{
16         int r=l+i;
17         For(k,0,s[n]-s[r])f[l][r][k]=f[l][r-1][0]+(b[r]+k)*(b[r]+k);
18         Bor(k,l,r-1) if(a[k]==a[r]) For(j,0,s[n]-s[r])
19             f[l][r][j]=Max(f[l][r][j],f[l][k][b[r]+j]+f[k+1][r-1][0]);
20     }
21     cout<<f[1][n][0];
22     return 0;
23 }

原文地址:https://www.cnblogs.com/five20/p/9017121.html

时间: 2024-12-13 20:31:13

P2135 方块消除的相关文章

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

玩过方块消除游戏吗?现在规定当有两个或两个以上相邻且颜色相同的方块在一起的时候,它们就会产生消除反应.当存在多个消除反应同时产生时,最下的反应先执行.现在只给你其中一列,求最后剩下的方块结果. 输入要求 第一行是一个整数T(T<=100),表示有T组测试数据.每组测试数据一行.每行有一串数字(数字长度<=1,000,000),按从下往上给出一列方块的颜色(颜色用0-9表示,每个数字代表一种颜色).(数字长度大于100,000的不超过5组) 输出要求 输出消除后的结果. 测试数据示例 输入 21

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

Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4250   Accepted: 1704 Description Some of you may have played a game called 'Blocks'. There are n blocks in a row, each box has a color. Here is an example: Gold, Silver, Silver, Sil

10559 - Blocks(方块消除|DP)

该题乍一看和矩阵链乘很相似,可是有一个不同之处就是该题可以拼接 .   为了达到这个目的,我们不得不拓展维度d[i][j][k],用一个k表示最右边拼接了k个和a[j]相同颜色的方块. 问题的关键在于拼接,当右边存在一个q < p 且 a[q] == q[j] && a[q] != a[q+1] 时,可以拼接,要注意,所有满足这个条件的q都应该递归求解,因为哪一部分拼接起来更好,是不一定的 . 细节见代码: #include<bits/stdc++.h> using na

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

ACM算法总结及刷题参考

参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965)    (2)贪心(poj1328,poj2109,poj2586)    (3)递归和分治法.     (4)递推.     (5)构造法.(po

玛雅游戏

Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1. 每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7):如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从

【noip2011】【codevs1136】Mayan游戏

3.Mayan 游戏(mayan.cpp/c/pas)[问题描述]Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:1.每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7):如果

H5版俄罗斯方块(1)---需求分析和目标创新

前言: 俄罗斯方块和五子棋一样, 规则简单, 上手容易. 几乎每个开发者, 都会在其青春年华时, 签下"xx到此一游". 犹记得大一老师在布置大程作业的时候提过: "什么都可以写, 唯一不能写的是俄罗斯方块". 这次想借学Html5的机会, 重温下俄罗斯方块. 当然不是单一的实现, 希望有所创新, 在可玩性/趣味性上有所突破. 调研: 在4399这个游戏平台上, 选择了几款俄罗斯方块相关的游戏进行试玩. 大致总结了下各类俄罗斯方块的新意. • 引入场景 码头俄罗斯方

洛谷P1312 [NOIOP2011提高组 Day1T3]Mayan游戏

Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1 .每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将 交换位置(参见输入输出样例说明中的图6 到图7 ):如果目标位置上没有方块,那么被拖动的