题目描述

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=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<<f[1][n][0];return 0;
}

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

P2135 方块消除相关推荐

  1. PKU1390UVA10559方块消除+弱化版P2135

    洛谷UVA10559题面: 题目描述 有 n 个带有颜色的方块,没消除一段长度为x的连续的相同颜色的方块可以得到 x^2 的分数,让你用一种最优的顺序消除所有方块使得得分最多. 输入格式 第一行包含测 ...

  2. 【方块消除】(附加工程)

    方块消除 一.引擎 二.游戏流程 图示 游戏 三.研发阶段 1.导入框架DLFramwork 2.Game游戏入口 3.GameMgr游戏管理类 4.BlockMgr主要提供可供全局访问的方块数组,是 ...

  3. CocosCreator 方块消除教程

    方块消除教程 <背景>--------------------------------------------------------------------.1 <方块>-- ...

  4. 第4-8课:方块消除游戏

    前面基础部分我们介绍过简单的串模型的动态规划,在这个系列中,我们又介绍了区间动态规划模型.状态压缩动态规划模型和线性动态规划模型.我们用的算法实现都是尽量使用状态递推关系式直接用递推的方法,大家可能都 ...

  5. 方块消除 UVA10559

    题意:给一排方块,每个方块有一个颜色,每次可以选几个连续颜色相同方块消除,得分为方块数平方,求最大总得分. 按照一般的序列dp思路,dp[i][j]应当从dp[i][k]和dp[k][j]中转移(i& ...

  6. 1109: 方块消除 blocks

    时间限制: 1 Sec 内存限制: 128 MB O2 提交: 127 解决: 59 [提交][状态][博客][加入收藏] 题目描述 Jimmy最近迷上了一款叫做方块消除的游戏. 游戏规则如下:N个带 ...

  7. Python学习:方块消除游戏

    [编程题:方块消除游戏] emmmm..依然牛客网上的题,难度标识才一颗星,但是感觉自己看代码看了好久才理解实现的过程. 题目描述:如下图,有10*10个不同颜色的方块,每个方块可能是红.绿.蓝.黄. ...

  8. 方块消除游戏(完美世界2017秋招真题)

    方块消除游戏(完美世界2017秋招真题)题目描述 如下图,有10*10个不同颜色的方块,每个方块可能是红.绿.蓝.黄.紫5种颜色之一.当点击其中某一个方块时,如果它有相邻的同颜色方块,则将所有与此方块 ...

  9. puzzle(1412)俄罗斯方块、方块消除、解封方块

    目录 俄罗斯方块 方块消除 彩方块消除 解封方块 俄罗斯方块 4399在线play 凑齐一行就消除. 方块消除 4399在线play 不区分颜色,只要一行.一列或者一宫9个格子都填满了,即可消除. 彩 ...

最新文章

  1. 【NLP实战】tensorflow词向量训练实战
  2. C++ 文件读写操作01
  3. 阿里开发者们的第16个感悟:让阅读源码成为习惯
  4. c语言用菜单做计算器,小白求大神帮忙用C语言做个多功能计算器!!!!
  5. american fuzzy lop 介绍
  6. 全面进军javascript!
  7. .NET Framework 3.5 SP1的图表控件——Chart (转)
  8. 配置lvs nat模式下real server服务器端lvsrs脚本
  9. 关于Ubuntu中passwd、shadow、group等文件
  10. Qt5学习笔记之bin文件合成工具一:使用对话框选取本地文件并读取
  11. fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
  12. 【IDEA系列】利用 IntelliJ IDEA 进行代码对比的方法
  13. 怎么查看文件的MD5码
  14. vulhub环境搭建
  15. Defect Analysis
  16. python菜鸟教程官网绘图-Python Tkinter 画布(Canvas)
  17. Win7问题汇总及解答!
  18. Android4.1 如何实现状态栏上信号图标有SIM卡1,2标记,并且当处于2G状态显示“G”,处于3G状态显示“3G”
  19. MATLAB2014a,MEX编译问题
  20. 微信小程序报错-41008或者40125

热门文章

  1. windows GitLab配置ssh秘钥keys
  2. FRP + 腾讯云 内网穿透
  3. java 自定义标签_Java自定义标签用法实例分析
  4. 车牌识别关键技术-车牌定位
  5. springboot微信授权登录
  6. 程序员必备的软技能-金字塔原理拆解(上)
  7. 凛冬至送温暖,无价资源免费送
  8. python发牌代码十点半_Python制作扑克牌发牌程序,另含大量Python代码!
  9. 非常实用的12条 SQL 优化方案
  10. 内边距和外边距,清除默认的内外边距