<更新提示>

<第一次更新>


<正文>

Blocks

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, Silver, Silver, Bronze, Bronze, Bronze, Gold. The corresponding picture will be as shown below:

If some adjacent boxes are all of the same color, and both the box to its left(if it exists) and its right(if it exists) are of some other color, we call it a 'box segment'. There are 4 box segments. That is: gold, silver, bronze, gold. There are 1, 4, 3, 1 box(es) in the segments respectively.

Every time, you can click a box, then the whole segment containing that box DISAPPEARS. If that segment is composed of k boxes, you will get kk points. for example, if you click on a silver box, the silver segment disappears, you got 44=16 points.

Now let's look at the picture below:

The first one is OPTIMAL.

Find the highest score you can get, given an initial state of this game.

题意:通过点击某一颜色消除相邻的所有的这种颜色,得分为len*len,求最大分

Input Format

第一行为一个整数 N。

第二行为 A1,A2,…,AN。

Output Format

一行一个整数,代表最大价值。

Sample Input

9
1 2 2 2 2 3 3 3 1

Sample Output

29

解析

这种区间操作类的最优解问题显然是区间\(dp\),不过这道题的状态有点棘手。

对于一次消除操作,可能会带来左右两边原本不相邻的部分合并带来的影响,所以通常来说的状态是不行了。我们考虑设计一种状态能够记录这种合并带来的影响:设\(f[l][r][k]\)代表区间消除\([l,r]\),序列后面通过消除操作使得有\(k\)个颜色为\(a[r]\)的块跟在区间\([l,r]\)后面的最大得分。

考虑转移,显然,我们可以直接将后面跟着的\(k\)个块和第\(r\)个块连在一起消掉,这是一种转移方式。还有就是我们可以在区间\([l,r-1]\)中枚举一个颜色与\(a[r]\)相同的点\(i\),然后将区间\([i+1,r-1]\)作为一个子问题直接消去,这样就使得\(a[r]\)加入后面跟着的\(k\)个块中,\(i\)成为右端点,利用这个状态转移即可。

至于如何枚举区间内和\(a[r]\)颜色相同的点呢?这是可以预处理直接向前查找的。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
const int N = 220;
int n,a[N],pre[N],last[N];
int f[N][N][N];
inline void input(void)
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
}
inline void init(void)
{
for (int i=1;i<=n;i++)
{
pre[i] = last[a[i]];
last[a[i]] = i;
}
}
inline int dp(int l,int r,int k)
{
if ( l > r ) return 0;
if ( f[l][r][k] ) return f[l][r][k];
f[l][r][k] = dp( l , r-1 , 0 ) + (k+1) * (k+1);
for (int i=pre[r];i>=l;i=pre[i])
f[l][r][k] = max( f[l][r][k] , dp( l , i , k+1 ) + dp( i+1 , r-1 , 0 ) );
return f[l][r][k];
}
int main(void)
{
input();
init();
memset( f , 0 , sizeof f );
dp( 1 , n , 0 );
printf("%d\n",f[1][n][0]);
return 0;
}

<后记>

『Blocks 区间dp』的更多相关文章

  1. 『count 区间dp』

    count Description 既然是萌萌哒 visit_world 的比赛,那必然会有一道计数题啦! 考虑一个N个节点的二叉树,它的节点被标上了1-N的编号. 并且,编号为i的节点在二叉树的前序 ...

  2. 『金字塔 区间dp』

    金字塔 Description 虽然探索金字塔是极其老套的剧情,但是这一队 探险家还是到了某金字塔脚下.经过多年的研究,科 学家对这座金字塔的内部结构已经有所了解.首先, 金字塔由若干房间组成,房间之 ...

  3. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  4. POJ 1390 Blocks(区间DP)

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

  5. POJ1390 Blocks (区间DP)

    题目链接:POJ 1390.Blocks 题意: 有n个方块排成一列,每个方块有颜色即1到n的一个值,每次操作可以把一段相同颜色的方块拿走,长度为k,则获得的分数为 \(k\times k\),求可获 ...

  6. UVA10559&POJ1390 Blocks 区间DP

    题目传送门:http://poj.org/problem?id=1390 题意:给出一个长为$N$的串,可以每次消除颜色相同的一段并获得其长度平方的分数,求最大分数.数据组数$\leq 15$,$N ...

  7. UVA 10559 Blocks——区间dp

    题目:https://www.luogu.org/problemnew/show/UVA10559 应该想到区间dp.但怎么设计状态? 因为连续的东西有分值,所以应该记录一下连续的有多少个. 只要记录 ...

  8. UVA 10559 Blocks —— 区间DP

    题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][ ...

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

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

随机推荐

  1. 有些CRM settype用事务码COMM_ATTRSET打不开的原因

    This question is asked by Dr. Lin. Issue For example, settype COM_COMMERCIAL could be opened via tco ...

  2. 【学习笔记】大数据技术原理与应用(MOOC视频、厦门大学林子雨)

    1 大数据概述 大数据特性:4v volume velocity variety value 即大量化.快速化.多样化.价值密度低 数据量大:大数据摩尔定律 快速化:从数据的生成到消耗,时间窗口小,可 ...

  3. 高并发&高可用系统的常见应对策略

    解耦神器:MQ MQ是分布式架构中的解耦神器,应用非常普遍.有些分布式事务也是利用MQ来做的.由于其高吞吐量,在一些业务比较复杂的情况,可以先做基本的数据验证,然后将数据放入MQ,由消费者异步去处理后 ...

  4. ASP.NET----内置对象----Resuest

    Request对象可以获取包含用户的计算机.页面及浏览器的请求等相关信息. Request对象的属性: ①Form----------返回有关表单变量的集合 ②QueryString--------- ...

  5. cephfs测试中出现的问题

    最近重新对cephfs进行性能测试. 测试步骤: (1) 选取一个特地版本的操作系统内核,挂载20000个客户端; (2) 用iozone中的fileop工具,在每隔挂载点上都跑一个fileop进程; ...

  6. Python的字符串与字节码转换

    一张图弄懂python的字符串与字节码转换  

  7. [PAT] 目录

    题号  PAT Basic  PAT Advaced  PAT Top 1001 害死人不偿命的(3n+1)猜想     1002 写出这个数     1003 我要通过!     1004 成绩排名 ...

  8. PAT 乙级 1036.跟奥巴马一起编程 C++/Java

    题目来源 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏 ...

  9. Wpf DataGrid动态添加列,行数据(一)

    由于最近有这方面的需求,而且刚接触wpf不久,在网上找了很多方法,都不是使用MVVM模式的,因为DataGrid的列不能绑定 这就难受了,我想了个折中的方法,这个是使用了MVVMLight的消息机制, ...

  10. python字典中显示中文

    #coding=utf-8import jsondict={'title':"这是中文"}print json.dumps(dict,ensure_ascii=False,enco ...