[BZOJ 1032][JSOI 2007]祖玛 题解(区间DP)
[BZOJ 1032][JSOI 2007]祖玛
Description
Solution
1.考虑初始化的方式。
由于同色转移起来复杂,我们考虑把相邻的同色的球缩成一个球,记录下缩后的球代表的原来的个数。
这时我们考虑对刷的表的初始化,f[L][R]表示[L,R]区间中需要打入的最小珠子数。
由于是最小个数答案,所以全部初始化为正无穷,但对于缩后的状态,我们考虑不受其他合并时影响的结果:
如果个数为1,那么此时需要打入两个同色球,f[i][i]=2;
如果个数大于等于二,那么此时只需要打入一个同色球,f[i][i]=1;
即:for(int i=1;i<=list[0];++i)f[i][i]=num[i]>1?1:2;
2.考虑DP的方式:常见的枚举断点组合求解。
但是我们注意此题的特殊性质:合并过程中两端球个数大于等于3直接消掉,所以如果两端颜色相等,我们枚举断点前先判断:
如果两端球数合起来多于两个,那么直接等于左右向中间各缩进一个的答案;
如果合起来等于两个,那么还需要再打入一个;
即: if(list[l]==list[r]) f[l][r]=f[l+1][r-1]+(num[l]+num[r]>2?0:1);
剩余部分直接枚举断点松弛大的区间即可。
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define R register
using namespace std;
int num[510],list[510],f[510][510];
inline int rd(){
int x=0;
bool f=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') f=0;
c=getchar();
}
while(isdigit(c)){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return f?x:-x;
}
int init(int n){
int x,cnt=1;
for(int i=1;i<=n;++i)
for(int j=i;j<=n;++j)
f[i][j]=0x3f3f3f3f;
list[++list[0]]=rd();
for(int i=2;i<=n;++i){
x=rd();
if(x==list[list[0]])++cnt;
else{
num[list[0]]=cnt;
list[++list[0]]=x;
cnt=1;
}
}
num[list[0]]=cnt;
for(int i=1;i<=list[0];++i)f[i][i]=num[i]>1?1:2;
}
int main(){
init(rd());
for(int len=2;len<=list[0];++len)
for(int l=1;l<=list[0]-len+1;++l){
int r=l+len-1;
if(list[l]==list[r]) f[l][r]=f[l+1][r-1]+(num[l]+num[r]>2?0:1);
for(int k=l;k<r;++k) f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]);
}
printf("%d",f[1][list[0]]);
return 0;
}
PS:对于三个离散的点聚集在一起的情况,标程是错误的,所以当年数据据说没有那种情况的,至今貌似还没有比较完美的解法,特判就好了......
有关区间DP的其他讲解参考我的随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/9038198.html
[BZOJ 1032][JSOI 2007]祖玛 题解(区间DP)的更多相关文章
- BZOJ 1032 JSOI 2007 祖码Zuma 区间DP
题目大意:依照祖玛的玩法(任意选颜色),给出一段区间.问最少用多少个球可以把全部颜色块都消除. 思路:把输入数据依照连续的块处理.保存成颜色和数量.然后用这个来DP.我们知道,一个单独的块须要两个同样 ...
- Blocks题解(区间dp)
Blocks题解 区间dp 阅读体验...https://zybuluo.com/Junlier/note/1289712 很好的一道区间dp的题目(别问我怎么想到的) dp状态 其实这个题最难的地方 ...
- BZOJ 1996: [Hnoi2010]chorus 合唱队(区间dp)
题目: https://www.lydsy.com/JudgeOnline/problem.php?id=1996 题解: 这题刚拿到手的时候一脸懵逼qwq,经过思考与分析(看题解),发现是一道区间d ...
- BZOJ.4897.[Thu Summer Camp2016]成绩单(区间DP)
BZOJ 显然是个区间DP.令\(f[l][r]\)表示全部消掉区间\([l,r]\)的最小花费. 因为是可以通过删掉若干子串来删子序列的,所以并不好直接转移.而花费只与最大最小值有关,所以再令\(g ...
- luogu1005矩阵取数游戏题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P1005 分析 忽然发现这篇题解好像并没有什么意义...因为跟奶牛零食那道题一模一样,博主比较懒如果您想看题解的 ...
- bzoj 1055 [HAOI2008]玩具取名(区间DP)
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1258 Solved: 729[Submit][Statu ...
- BZOJ 1260: [CQOI2007]涂色paint( 区间dp )
区间dp.. dp( l , r ) 表示让 [ l , r ] 这个区间都变成目标颜色的最少涂色次数. 考虑转移 : l == r 则 dp( l , r ) = 1 ( 显然 ) s[ l ] = ...
- BZOJ.3928.[CERC2014]Outer space invaders(区间DP)
BZOJ3928 双倍经验BZOJ4048 Codeforces GYM100543 L \(Description\) \(Solution\) 考虑出现时间在\([l,r]\)内的敌人,设最远的敌 ...
- 【BZOJ 4565】 [Haoi2016]字符合并 区间dp+状压
考试的时候由于总是搞这道题导致爆零~~~~~(神™倒序难度.....) 考试的时候想着想着想用状压,但是觉得不行又想用区间dp,然而正解是状压着搞区间,这充分说明了一件事,状压不是只是一种dp而是一种 ...
随机推荐
- CocoStuff—基于Deeplab训练数据的标定工具【二、用已提供的标注数据跑通项目】
一.说明 本文为系列博客第二篇,主要讲述笔者在使用该团队提供已经标注好的COCO数据集进行训练的过程. 由于在windows中编译Caffe和Deeplab特别的麻烦,笔者并没有去探索,后续可能会去尝 ...
- C++ 派生类成员的访问属性
派生类成员的访问属性: C++继承方式总共分为以下几种:public.private.protected三种(它们直接影响到派生类的成员.及其对象对基类成员访问的规则).(1)public(公有继承) ...
- 20181023-3 每周例行报告(添加PSP)
此作业要求:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2100] 一.本周PSP表格 类型 任务 开始时间 结束时间 中断时间 净时 ...
- beta4
吴晓晖(组长) 过去两天完成了哪些任务 昨天FloatingActionButton和权限获取调整 今天复习,没写东西,晚点有空了写 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还 ...
- python scipy stats学习笔记
from scipy.stats import chi2 # 卡方分布from scipy.stats import norm # 正态分布from scipy.stats import t # t分 ...
- 什么是GPS的冷启动、温启动和热启动?
对于GPS多种启动方式的概念还很模糊,冷启动.热启动.温启动各种专业术语铺天盖地,使得许多用户眼花缭乱. 我们简单从定义上了解一下几种GPS启动的方式,GPS开机启动分为冷启动.温启动.热启动三种. ...
- PHP 爬虫——QueryList
前言: 来了个任务说要做个电影网站,要写个壳,数据直接从别人那扒.行吧!那就要学习下PHP爬虫了.占个博客,以后补充.http://study.querylist.cc/archives/6/ 之前开 ...
- delphi XE的字符串处理
最近用delphi xe做了个东西,因为以前一直使用Delphi 7做开发,delphi 7 到delphi XE有了很大的变化,最大的变化就是对Unicode的支持,所以刚开始使用DELPHI XE ...
- Docker(十一)-Docker commit创建镜像
创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 修改已有的镜像 查看已有的镜像: $ sudo docker images REPOSITO ...
- Windows 下面的 redis GUI操作工具
1. 下载地址 redisdesktop https://redisdesktop.com/download 2. 下载windows版本并且进行安装 处理redis 的参数 根据上面的一篇博客 采取 ...