Blocks题解(区间dp)
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]\):显然有两种转移
我这里是用记忆化搜索实现的
- 消掉j和后面的k块
```
dp[i][j][k]=max(dp[i][j][k],Dfs(i,j-1,0)+(k+1)*(k+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)的更多相关文章
- UVA10559 方块消除 Blocks(区间dp)
一道区间dp好题,在GZY的ppt里,同时在洛谷题解里看见了Itst orz. 题目大意 有n个带有颜色的方块,没消除一段长度为 \(x\) 的连续的相同颜色的方块可以得到 \(x^2\) 的分数,用 ...
- luogu1005矩阵取数游戏题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P1005 分析 忽然发现这篇题解好像并没有什么意义...因为跟奶牛零食那道题一模一样,博主比较懒如果您想看题解的 ...
- 【Uva10559】Blocks(区间DP)
Description 题意:有一排数量为N的方块,每次可以把连续的相同颜色的区间消除,得到分数为区间长度的平方,然后左右两边连在一起,问最大分数为多少. \(1\leq N\leq200\) Sol ...
- luogu2858奶牛零食题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P2858 一句话题意: https://cn.vjudge.net/problem/POJ-3186#autho ...
- luogu4302字符串折叠题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P4302 分析 很明显一道区间DP题,对于区间\([l,r]\)的字符串,如果它的字串是最优折叠的,那么它的最优 ...
- 洛谷P1220 关路灯 题解 区间DP
题目链接:https://www.luogu.com.cn/problem/P1220 本题涉及算法:区间DP. 我们一开始要做一些初始化操作,令: \(p[i]\) 表示第i个路灯的位置: \(w[ ...
- 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 ...
- 2017 ACM-ICPC亚洲区域赛北京站J题 Pangu and Stones 题解 区间DP
题目链接:http://www.hihocoder.com/problemset/problem/1636 题目描述 在中国古代神话中,盘古是时间第一个人并且开天辟地,它从混沌中醒来并把混沌分为天地. ...
- luogu4677山区建小学题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P4677 分析 这道题方法跟之前题不一样,我们相当于枚举一个左右端点来线性扩展,同时划分断点进行决策 \(f[i ...
随机推荐
- Unity 官网无法访问|国外网站访问过慢|国外网站访问加速器
目录 1. 文档地址 2. 按 3. 工具下载地址 1. 文档地址 GitHub博客 https://coco5666.github.io/blog/articles/20190704-01/ 2. ...
- Linux架构之NFS共享存储1
第35章 NFS共享存储 35.1 NFS基本概述 NFS是Network File System的缩写及网络文件系统.NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录. 常见的文件 ...
- split 分割文件
1.命令功能 split将文件分割成多个碎片文件. 2.语法格式 split option input prefix split 选项 输入文件名 输出文件名前缀 参数说明 参数 参 ...
- mvn 打包排除test
mvn clean package compile -Dmaven.test.skip=true
- Git的配置与基本操作
Git是一个版本控制软件,它可以让我们能够拍摄处于可行状态的项目的快照,修改项目(如实现新功能)后,如果项目不能正常运行,可以恢复到前一个可行状态. 通过使用版本控制,我们可以无忧无虑的改进项目,不用 ...
- Js中window.location.href和window.location.replace的区别
href相当于打开一个新页面,replace相当于替换当前页面:这里打开页面都是针对历史记录来说,在页面上看完全相同,只是浏览器的history表现不同如果在1.html中点击链接到2.html,然后 ...
- JavaWeb(四):JDBC
数据持久化(persistence) 把数据保存到可掉电式存储设备中以供之后使用. 大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各 ...
- ubuntu + JetSonNano+OpenCV3.4.8
首先强调一点,如果要配置darknet环境,不建议安装该版本!!! 安装opencv前,建议先检测自己的系统是否已经装过其他版本, 检查方式: (1)查看是否安装opencv库: pkg-config ...
- 回归平方和 ESS,残差平方和 RSS,总体平方和 TSS
https://zhidao.baidu.com/question/565190261749684764.html 回归平方和 ESS,残差平方和 RSS,总体平方和 TSS 总变差 ...
- vue双向数据绑定对于数组和新增对象属性不能监听的解决办法
出现数组不能按照索引进行跟新的原因是处于性能考虑的,但是整体数组的增加删除是可以监听到的:对于对象新增属性不能监听是因为没有在生成vue实例时候放进watcher收集依赖. 首先我们先来了解vue数据 ...