博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2135 方块消除
阅读量:5020 次
发布时间:2019-06-12

本文共 1901 字,大约阅读时间需要 6 分钟。

题目描述

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: 
41 2 3 11 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
#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=51;int n,a[N],b[N],f[N][N][N*3],s[N];int main(){ ios::sync_with_stdio(0); cin>>n; For(i,1,n)cin>>a[i]; For(i,1,n)cin>>b[i],s[i]=s[i-1]+b[i]; For(i,0,n-1) For(l,1,n) if(l+i>n)break; else{ int r=l+i; For(k,0,s[n]-s[r])f[l][r][k]=f[l][r-1][0]+(b[r]+k)*(b[r]+k); Bor(k,l,r-1) if(a[k]==a[r]) For(j,0,s[n]-s[r]) f[l][r][j]=Max(f[l][r][j],f[l][k][b[r]+j]+f[k+1][r-1][0]); } cout<

 

转载于:https://www.cnblogs.com/five20/p/9017121.html

你可能感兴趣的文章
Jmeter性能测试 入门
查看>>
安卓动画有哪几种?他们的区别?
查看>>
Nodejs学习总结 -Express入门(一)
查看>>
web前端优化
查看>>
ssh 连接原理及ssh-keygen
查看>>
vs2013编译qt程序后中文出现乱码
查看>>
【转】IOS数据库操作SQLite3使用详解
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
设计网站大全
查看>>
JVM CUP占用率过高排除方法,windows环境
查看>>
【转】JAVA字符串格式化-String.format()的使用
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
微信架构(转)
查看>>
Web项目中的路径问题
查看>>
js随机数的取整
查看>>
关于解析漏洞
查看>>
十大经典预测算法(六)---集成学习(模型融合算法)
查看>>
用php做一个简单的注册用户功能
查看>>