Blocks题解

区间dp

阅读体验。。。https://zybuluo.com/Junlier/note/1289712

很好的一道区间dp的题目(别问我怎么想到的)

dp状态

其实这个题最难的地方是这道题目的状态怎么设

  • 首先既然是区间dp,那肯定最先想到的状态是

\(dp[i][j]\)表示消掉区间\([i,j]\)上所有的块的最大分数

  • 突然发现这个状态会受区间外和\(i\)或\(j\)颜色相同的块的影响

    并且转移也并不好转移=_=

  • 所以我们考虑换一种状态。。。

    既然说会受到外面的块的影响?那考虑一种方法来解决

\(dp[i][j][k]\)表示消掉区间\([i,j]\)并且区间\([i,j]\)右边还有k个和j颜色相同的块(除此之外,这个序列没有别的块了),消掉这些所有的块的最大分数

有点抽象,再来感性理解一下:

当前处理的子问题\(dp[i][j][k]\)主体由区间\([i,j]\)组成,然后与\(j\)相同有\(k\)块接在后面,这\(k\)块之间的其他块已经全部消完了

  • 如果实在还不明白,先看转移吧。。。

    然后可以根据我们前面的错误状态自己思考为什么加上这一维

转移

\(dp[i][j][k]\):显然有两种转移

我这里是用记忆化搜索实现的

  1. 消掉j和后面的k块
```
dp[i][j][k]=max(dp[i][j][k],Dfs(i,j-1,0)+(k+1)*(k+1));
```
  1. 对于区间\([i,j]\),中间可能有和\(j\)颜色相同的块,假设位置为\(p\),我们可以选择消掉区间\([p+1,j-1]\)中所有的块使颜色拼起来,当然这是个子问题,所以前面讲了用记忆化搜索实现

    PS: 下面代码的\(nxt[p]\)是预处理的在\(p\)前面第一个和\(p\)颜色相同的块的位置
```
for(int p=nxt[j];p>=i;p=nxt[p])//枚举p
dp[i][j][k]=max(dp[i][j][k],Dfs(i,p,k+1)+Dfs(p+1,j-1,0));
```

汇总

讲完这些整个程序的实现就不难了

那我直接放上代码,不好意思,没有注释

#include<bits/stdc++.h>
#define lst long long
#define ldb double
#define N 250
using namespace std;
const int Inf=1e9;
int read()
{
int s=0,m=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')m=1;ch=getchar();}
while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
} int n;
int col[N],nxt[N],hd[N];
lst dp[N][N][N];//消掉[i,j]区间和[i,j]右边和j颜色一样的连续k个方块的最大分数 lst Dfs(int i,int j,int k)
{
if(i>j)return 0;
if(dp[i][j][k])return dp[i][j][k];
dp[i][j][k]=max(dp[i][j][k],Dfs(i,j-1,0)+(k+1)*(k+1));
for(int p=nxt[j];p>=i;p=nxt[p])
dp[i][j][k]=max(dp[i][j][k],Dfs(i,p,k+1)+Dfs(p+1,j-1,0));
return dp[i][j][k];
} int main()
{
int T=read();
for(int tt=1;tt<=T;++tt)
{
n=read();
memset(hd,0,sizeof(hd));
memset(dp,0,sizeof(dp));
memset(nxt,0,sizeof(nxt));
for(int i=1;i<=n;++i)
{
col[i]=read();
nxt[i]=hd[col[i]];
hd[col[i]]=i;
}
printf("Case %d: %lld\n",tt,Dfs(1,n,0));
}
return 0;
}

Blocks题解(区间dp)的更多相关文章

  1. UVA10559 方块消除 Blocks(区间dp)

    一道区间dp好题,在GZY的ppt里,同时在洛谷题解里看见了Itst orz. 题目大意 有n个带有颜色的方块,没消除一段长度为 \(x\) 的连续的相同颜色的方块可以得到 \(x^2\) 的分数,用 ...

  2. luogu1005矩阵取数游戏题解--区间DP

    题目链接 https://www.luogu.org/problemnew/show/P1005 分析 忽然发现这篇题解好像并没有什么意义...因为跟奶牛零食那道题一模一样,博主比较懒如果您想看题解的 ...

  3. 【Uva10559】Blocks(区间DP)

    Description 题意:有一排数量为N的方块,每次可以把连续的相同颜色的区间消除,得到分数为区间长度的平方,然后左右两边连在一起,问最大分数为多少. \(1\leq N\leq200\) Sol ...

  4. luogu2858奶牛零食题解--区间DP

    题目链接 https://www.luogu.org/problemnew/show/P2858 一句话题意: https://cn.vjudge.net/problem/POJ-3186#autho ...

  5. luogu4302字符串折叠题解--区间DP

    题目链接 https://www.luogu.org/problemnew/show/P4302 分析 很明显一道区间DP题,对于区间\([l,r]\)的字符串,如果它的字串是最优折叠的,那么它的最优 ...

  6. 洛谷P1220 关路灯 题解 区间DP

    题目链接:https://www.luogu.com.cn/problem/P1220 本题涉及算法:区间DP. 我们一开始要做一些初始化操作,令: \(p[i]\) 表示第i个路灯的位置: \(w[ ...

  7. Blocks poj 区间dp

    Some of you may have played a game called 'Blocks'. There are n blocks in a row, each box has a colo ...

  8. 2017 ACM-ICPC亚洲区域赛北京站J题 Pangu and Stones 题解 区间DP

    题目链接:http://www.hihocoder.com/problemset/problem/1636 题目描述 在中国古代神话中,盘古是时间第一个人并且开天辟地,它从混沌中醒来并把混沌分为天地. ...

  9. luogu4677山区建小学题解--区间DP

    题目链接 https://www.luogu.org/problemnew/show/P4677 分析 这道题方法跟之前题不一样,我们相当于枚举一个左右端点来线性扩展,同时划分断点进行决策 \(f[i ...

随机推荐

  1. pg_config - 检索已安装版本的 PostgreSQL 的信息

    SYNOPSIS pg_config {--bindir | --includedir | --includedir-server | --libdir | --pkglibdir | --confi ...

  2. python3-定义函数

    在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...

  3. CSS3选择器 :read-only选择器 CSS3选择器 :read-write选择器

    CSS3选择器 :read-only选择器 “:read-only”伪类选择器用来指定处于只读状态元素的样式.简单点理解就是,元素中设置了“readonly=’readonly’” 示例演示 通过“: ...

  4. bzoj4448 [Scoi2015]情报传递 主席树+树上差分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4448 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...

  5. 【leetcode】394. Decode String

    题目如下: 解题思路:这种题目和四则运算,去括号的题目很类似.解法也差不多. 代码如下: class Solution(object): def decodeString(self, s): &quo ...

  6. 循环神经网络(LSTM和GRU)(2)

    1.tf.nn.dynamic_rnn()函数 参考:http://www.360doc.com/content/17/0321/10/10408243_638692495.shtml 参考:http ...

  7. securityDemopom

    <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...

  8. 使用linkedlist封装简单的先进先出队列

    创建一个类Queue代表队列(先进先出),添加add(Object obj) 及get()方法, 并添加main()方法进行验证 思路: 使用LinkedList实现队列,在向LinkedList中添 ...

  9. Python_004(列表和元组)

    一.列表 1. 列表: 列表的创建:li = [],列表中可以放置字符串,元组,列表,字典,列表等各种数据类型,32位的Python可以存放2^32个数据 2. 列表的索引和切片 列表的索引:格式ls ...

  10. github配置和使用

    通过手册指导生产ssh key或取已有的ssh key root@iZwz93telmwbh624e5zetqZ:~# ls -al ~/.ssh total drwx------ root root ...