问题描述

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.

输入格式

The first line contains the number of tests t(1<=t<=15). Each case contains two lines. The first line contains an integer n(1<=n<=200), the number of boxes. The second line contains n integers, representing the colors of each box. The integers are in the range 1~n.

输出格式

For each test case, print the case number and the highest possible score.

样例输入

2

9

1 2 2 2 2 3 3 3 1

1

1

样例输出

Case 1: 29

Case 2: 1

题意概括

给定一个序列,每次可以消去一个均为同种元素的区间,若区间长度为k,则将会获得k*k的分数。求最大可以获得的分数。

解析

显然这是一道区间动态规划的题目,可以用记忆化搜索的方式去实现。首先,我们可以用\(l\)和\(r\)表示区间的范围。但是,仅由此还不够进行状态转移,因为还需要一个变量来衡量连续区间的长度。我们的突破口是每一个状态子区间的独立性。

对于一个子区间\([l,r]\),想要消去这个区间就只有两个办法:一是消去与r相邻的所有相同颜色的方块,再消去区间\([l,r-1]\);二是找到在\([l,r]\)中的某个位置\(k\)使\(r\)和\(k\)颜色相同,消去区间\([k+1,r-1]\)使相同色块拼在一起后再一同消去,然后消去区间\([l,k-1]\)。这样做的依据就是前面提到的独立性。对于任何一个区间,目标都只是消去该区间,而不用管其他的区间。区间内部则由区间的相互独立的子区间决定。这就说明了下面的方程中0的出现。

综上所述,设\(f[l][r][k]\)表示在区间\([l,r]\)右边与\(r\)同色的有\(k\)块时消去该区间(包括右边相同的部分)的最优解。我们可以得到如下状态转移方程:

\[f[l][r][k]=max(f[l][r-1][0]+(k+1)^2,f[l][i-1][k+1]+f[i+1][r-1][0])
\]

其中\(l<=i<=r,col[i]=col[r]\)。为了题目需要,我们还需要记录每个色块前面第一个和自己相同的颜色。这个可以借鉴图论中邻接表的思想来实现。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#define N 202
using namespace std;
int t,n,i,a[N],f[N][N][N],nxt[N],head[N],cnt;
int dp(int l,int r,int k)
{
if(l>r) return 0;
if(f[l][r][k]!=0) return f[l][r][k];
f[l][r][k]=max(f[l][r][k],dp(l,r-1,0)+(k+1)*(k+1));
for(int i=nxt[r];i>=l;i=nxt[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()
{
cin>>t;
while(t--){
cnt++;
cin>>n;
memset(f,0,sizeof(f));
memset(head,0,sizeof(head));
memset(nxt,0,sizeof(nxt));
for(i=1;i<=n;i++){
cin>>a[i];
nxt[i]=head[a[i]];
head[a[i]]=i;
}
cout<<"Case "<<cnt<<": "<<dp(1,n,0)<<endl;
}
}

[POJ 1390] Blocking的更多相关文章

  1. poj 1390 Blocks

    poj 1390 Blocks 题意 一排带有颜色的砖块,每一个可以消除相同颜色的砖块,,每一次可以到块数k的平方分数.问怎么消能使分数最大.. 题解 此题在徐源盛<对一类动态规划问题的研究&g ...

  2. POJ 1390 Blocks(记忆化搜索+dp)

    POJ 1390 Blocks 砌块 时限:5000 MS   内存限制:65536K 提交材料共计: 6204   接受: 2563 描述 你们中的一些人可能玩过一个叫做“积木”的游戏.一行有n个块 ...

  3. 【POJ 1390】Blocks

    http://poj.org/problem?id=1390 黑书上的例题,感觉我这辈子是想不到这样的dp了QAQ \(f(i,j,k)\)表示将\(i\)到\(j\)合并,并且假设未来会有\(k\) ...

  4. poj 1390 区间dp

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5035   Accepted: 2065 Descriptio ...

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

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

  6. POJ 1390 Block

    Description 给你一堆块,每个块有颜色,每次可以消去相邻颜色块,并获得块大小平方的分数,求最高得分. Sol DP/记忆化搜索. \(f[i][j][k]\) 表示 \((i,j)\) 这个 ...

  7. poj 1390 动态规划

    思路: 黑书的例题 #include<iostream> #include<cstring> #include<algorithm> #include<cma ...

  8. POJ 1390 Blocks(区间DP)

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

  9. POJ 1390 Blocks(DP + 思维)题解

    题意:有一排颜色的球,每次选择一个球消去,那么这个球所在的同颜色的整段都消去(和消消乐同理),若消去k个,那么得分k*k,问你消完所有球最大得分 思路:显然这里我们直接用二位数组设区间DP行不通,我们 ...

随机推荐

  1. BBED ORA-00600: internal error code, arguments: [16703], [1403], [20], [], [], [], [], [], [], [], [], []

    BBED模拟并修复 删除:$ORACLE_HOME/rdbms/admin/prvtsupp.plb SQL> alter database open;alter database open*E ...

  2. 二十八、python中的os模块

    A.os模块:系统相关的(相对比较常用的有:os.stat('path/filename'),os.path.split(path),os.path.dirname(path),os.path.bas ...

  3. 架构-数据库访问-SQL语言进行连接数据库服务器-DB-Library:DB-Library

    ylbtech-数据库访问-SQL语言进行连接数据库服务器-DB-Library:DB-Library 1.返回顶部 1. 在基于三层构架的信息系统开发中,应用服务器要利用SQL语言进行连接数据库服务 ...

  4. Crypko 基于滚动条进行的动画是如何实现的?

    Crypko 网站里面的下拉滚动条进行的动画感觉非常炫,于是研究了一下她的实现,发现她主要是使用了 ScrollMagic 这个库实现了基于滚动条的动画. 为什么这么确定就是用了 ScrollMagi ...

  5. 认识DOM(上)

    认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码 ...

  6. 再谈 COW、ROW 快照技术

    目录 目录 前言 快照与备份的区别 快照技术 增量快照之 COW 增量快照之 row 前言 在经过了一段时间的实践之后,再次回顾 COW/ROW 快照技术的实现原理,温故而知新. 快照与备份的区别 传 ...

  7. Learn Python the hard way, ex45 对象、类、以及从属关系

    #!/usr/bin/python #coding:utf-8 # animal is-a object(yes,sort of sonfusing)look at the extra credit ...

  8. Value Iteration Algorithm for MDP

    Value-Iteration Algorithm: For each iteration k+1: a. calculate the optimal state-value function for ...

  9. 应用安全-安全设备-Waf系列-软Waf-云锁

    安装 安装 - Linux 前提:检查selinux状态 - 关闭selinux getenforce #显示为disabled则为关闭 .下载 x86:wget http://download.yu ...

  10. java对象的方法属性和代码块的加载顺序

    1.静态变量 2.静态代码块 3.局部代码块 4.构造函数 5.普通代码块 6.静态方法 7.普通方法 8.普通属性 for example: package com.JavaTest2; publi ...