[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而是一种 ...
随机推荐
- CentOS7安装OpenStack(Rocky版)-02.安装Keyston认证服务组件(控制节点)
本文分享openstack的认证服务组件keystone --------------- 完美的分割线 ---------------- 2.0.keystone认证服务 1)用户与认证:用户权限与用 ...
- 《在kali上完成gdb调试》
kali使用流程 1.使menuos停止 方法如图: 效果如图: 2.启动调试 打开一个新的命令行,然后方法如下图: 3.设置断点 注:由图可看出,断点设置在sys_clone,dup_task_st ...
- python3 selenium打开Chrome报错闪退问题
ChromeDriver不匹配 Google Chrome 已是最新版本 版本 64.0.3282.186(正式版本) (32 位) ChromeDriver应该选择2.35 下载链接:https ...
- Alpha 答辩总结
前言 作业发布 组长 成员 贡献比例 ★ 530 雨勤 23% 311 旭 23% 403 俊 18% 223 元 23% 437 海辉 13% 10天 Alpha 冲刺站立会议博客链接汇总 Alph ...
- 基于python的机器学习实现日元币对人民币汇率预测
## 导入所需的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import tensorflow a ...
- Bean的加载
ClassPathXmlApplicationContext存储内容 为了更理解ApplicationContext,拿一个实例ClassPathXmlApplicationContext举例,看一下 ...
- dotTrace 每行执行时间和执行次数
如果代码中出现效率问题,使用dotTrace来跟踪分析代码的效率问题还是很方便的.使用dotTrace不但可以看到每一个方法被调用的次数和总时间,而且可以引入源代码,查看源代码中每一行执行的次数和时间 ...
- ES6之Promise用法详解
一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...
- Java 8新特性之lambda(八恶人-2)
Major Marquis Warren 沃伦·马奎斯少校 “Tring to get a couple of bounties in to Red Rock.”我想带几个通缉犯去红石镇 一.基本介绍 ...
- MT【74】不可能是哪个函数?
解答:设$f(g(x_0))=x_0$,则$g(f(g(x_0)))=g(x_0)$,令$y_0=g(x_0)$则$g(f(y_0))=y_0$有解.易得答案为$B$.