[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而是一种 ...
随机推荐
- PHP学习 Object Oriented 面向对象 OO
定义类class class_name [extends partclass_name]{public private protected var property_name = value;publ ...
- linux第七章笔记
第七章 链接 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于加载时,也就 ...
- django学习--2 模板
Django 模板 在上一章节中我们使用 django.http.HttpResponse() 来输出 "Hello World!".该方式将数据与视图混合在一起,不符合 Djan ...
- 在静态方法和非静态方法上加 Synchronized的区别
Synchronzied 修饰非静态方法==>对象锁 Synchronzied 修饰静态方法==>其实是类锁,因为是静态方法,它把整个类锁起来了: 1.Synchronized修饰非静态方 ...
- wordApp.Documents.Open 未将对象引用实例
wordApp.Documents.Open (.........),当我打开的是.docx,能正常打开当是.doc时,却返回空置,显示失败,未能找到文件.......,但其实文件都在 解决方案 WO ...
- 【bzoj1758】 Wc2010—重建计划
http://www.lydsy.com/JudgeOnline/problem.php?id=1758 (题目链接) 题意 给出一棵树,每条边有边权,问选出一条长度为$[L,U]$的路径,使得路径上 ...
- C/C++如何整行读入字符串?
在写代码的过程中,经常要一行一行的读入字符串进行处理,这里我总结了一些方法,供大家参考. 方法一:scanf()读入char[] 使用方法: ]; scanf("%[^\n]",& ...
- 【洛谷P1462】通往奥格瑞玛的道路
题目大意:给定一个 N 个点,M 条边的无向图,求从 1 号节点到 N 号节点的路径中,满足路径长度不大于 B 的情况下,经过顶点的点权的最大值最小是多少. 题解:最大值最小问题一般采用二分答案.这道 ...
- 【洛谷P2661】信息传递 (updated)
题目大意:给定一棵 N 个节点的内向树森林,求该内向树森林的最小环的大小(按边计算). 题解:先删链,再计算环的大小,统计答案即可. 代码如下 #include <bits/stdc++.h&g ...
- 9:@RequestMapping 用法详解之地址映射
引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为applicatio ...