题目描述 Description

神牛有很多…当然…每个同学都有自己衷心膜拜的神牛.
某学校有两位神牛,神牛甲和神牛乙。新入学的N位同学们早已耳闻他们的神话。所以,已经衷心地膜拜其中一位了。
现在,老师要给他们分机房。
但是,要么保证整个机房都是同一位神牛的膜拜者,或者两个神牛的膜拜者人数差不超过M。
另外,现在N位同学排成一排,老师只会把连续一段的同学分进一个机房。老师想知道,至少需要多少个机房。

 
输入描述 Input Description

输入文件第一行包括N和M。
之后N行,每行一个整数,1表示神牛甲的崇拜者,2表示神牛乙的崇拜者。

 
输出描述 Output Description

输出一个整数,表示最小需要机房的数量。

 
样例输入 Sample Input

5 1 

2  


2

样例输出 Sample Output

2

 
数据范围及提示 Data Size & Hint

对于30%的数据,有1≤N,M≤50;
对于100%的数据,有1≤N,M≤2500

本题可以转化为:将一段区间上的所有的点合并,求最少可以合并为多少的区间。

假设区间f[1,4]有4个点:

1、若最后2个能合并,即合并f[3,4],那么合并后的区间数a=f[1,2]+1,最后2个点合并为1个区间,就是那个1;f[1,2]暂且不管。

2、若最后3个能合并,即合并f[2,4],那么合并后的区间数b=f[1,1]+1,最后3个点合并为1个区间,就是那个1;f[1,1]暂且不管。

3、若最后4个能合并,即合并f[1,4],那么合并后的区间数c=f[1,0]+1,很明显,c=1.

请看加红色的部分,发现什么了吗?他们都是从1开始的,这在后面会用到

那么我为什么要倒着看区间能否合并呢?

因为动态规划递推到f[1,4]时,已经计算完了f[1,3],f[1,3]的值是有3个点时最优的,计算f[1,3]之前就计算完了f[1,2],f[1,2]的值是有2个点是最优的,以此类推。

倘若正着判断,我算区间f[1,4],首先看前2个能否合并,即f[1,4]=f[1,2]+f[3,4],前2个若能合并f[1,2]=1,但f[3,4]并不知道。

由此看出倒着推的好处是:另一个区间是从1开始的,而且这个区间在这之前已经确定了最优值,可以实现O(1)复杂度确定上面a、b、c的值(就是直接用)。而正着推得话,可以看到,前面f[3,4]是区间中的一段,不能直接利用,而且f[3,4]的最优解是什么,我们并不知道。

所以动态转移方程:

设当前要排队的区间为f[1,n],那么f[1,n]=min(f[1,m]+1),1<m<=n

初始化条件:答案数组ans[]除0外,都置为极大值,所以不能用memset(ans,127,sizeof(ans))。为什么呢?因为在循环计算f[1,k]时,是通过f[1,k-1]得到前几个的最优值。f[1,1]就可以通过f[0]递推得到,继而推出后面所有的。

那就有人有疑问了:我memset(ans,127,sizeof(ans))之后,另置f[1,1]=1,从第2个开始往后推,不就行了吗?答案是完全可以,个人习惯所致

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[],f[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++) f[i]=;//初始化
for(int i=;i<=n;i++)
{
int s1=,s2=,minn=;//s1,当前膜拜1的总人数,s2当前膜拜2的总人数,minn最少可以合并为多少个,即最少房间数
for(int j=i;j;j--)
{
if(a[j]==) s1++;
else s2++;
if(!s1||!s2||abs(s1-s2)<=m)
minn=min(minn,f[j-]+);
}
f[i]=minn;
}
printf("%d",f[n]);
}

codevs 3369 膜拜的更多相关文章

  1. codevs 3369 膜拜(线型)

    3369 膜拜 http://codevs.cn/problem/3369/ 题目描述 Description 神牛有很多…当然…每个同学都有自己衷心膜拜的神牛.某学校有两位神牛,神牛甲和神牛乙.新入 ...

  2. 膜拜(codevs 3369)

    3369 膜拜  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 神牛有很多…当然…每个同学都有自己衷心膜拜的 ...

  3. CODEVS 必做题:3149、2821、1531、3369、1230

    3149 爱改名的小融 2  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description Wikioi上有个人叫小融,他喜 ...

  4. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  5. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  6. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  7. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  8. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  9. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

随机推荐

  1. 最新Sublime Text 2 激活 汉化

    0x00 Sublime Text 2 Sublime Text 2 是一个轻量.简洁.高效.跨平台的编辑器,一直在使用它,简直是coder的必备神器,自从使用它之后就深深爱上它了(/▽\=),可能因 ...

  2. git pull/push项目的时候总是提示要输入用户名密码的解决方案

    作者:白狼 出处:www.manks.top/article/git_tip_user_password 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否 ...

  3. JMS发布/订阅消息传送例子

    前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...

  4. junit 使用

    今天用jsoup做了一个‘网络抓取实例’,然而,当作者把junit-4.11.jar 导入项目中,在类中方法上加入@Test,运行时却报错,报错代码如下: java.lang.NoClassDefFo ...

  5. 【转发】网易邮箱前端技术分享之javascript编码规范

    网易邮箱前端技术分享之javascript编码规范 发布日期:2013-11-26 10:06 来源:网易邮箱前端技术中心 作者:网易邮箱 点击:533 网易邮箱是国内最早使用ajax技术的邮箱.早在 ...

  6. cdh集群数据恢复

    CDH 数据库 磁盘坏了  所有集群配置 都没了    而且 还没备份  ....    元数据 还在  cdh  软件配置 和  安装软件 不能用了 下载 apache hadoop   重新配置  ...

  7. 【JSP】JSP基础学习记录(一)—— 基础介绍以及3个编译指令

    序: 从实现到现在一直是以.net为主,但偶尔也会参与一些其他语言的项目.最近需要对一个Java Web项目进行二次开发,一直没学习过JSP所以买了几本书自学试试.参考资料为<轻量级Java E ...

  8. ADO.NET知识汇总

    这又是一篇记录平常工作笔记的博客,无论是在排版还是解说上都不会有太多要求.同时这也是一篇不上博客园首页的博客,Just记录一些工作笔记. vSelect返回单个值 string connSQL = @ ...

  9. Sql Server 添加外部程序集基本操作

    简介:有时候Sql Server的内置函数没有那么好用的时候,可以引用一下外部程序集,下面献下丑,做下添加外部程序集操作 1.准备程序,编译出一个MyCLR的DLL. public class CLR ...

  10. HDFS分布式文件系统资源管理器开发总结

      HDFS,全称Hadoop分布式文件系统,作为Hadoop生态技术圈底层的关键技术之一,被设计成适合运行在通用硬件上的分布式文件系统.它和现有的分布式文件系统有很多共同点,但同时,它和其他的分布式 ...