【题目描述】

两个球队的支持者要一起坐车去看球,他们已经排成了一列。我们要让他们分乘若干辆巴士,同一辆巴士上的人必须在队伍中是连续的。为了在车上不起冲突,希望两队的支持者人数尽量相等,差至多是D。有一个例外,就是一辆车上的人全部都是一个球队的支持者。问要将这N个人全部送至球场,至少要几辆巴士。

输入格式

第一行是整数N和D,1<=N<=2500,1<=D<=N。

接下来的N行,按排队的顺序,描述每个人支持的球队,用H或J表示。

输出格式

至少要几辆巴士。


样例

样例输入

14 3
H
J
H
H
H
J
H
J
H
H
H
H
H
H

样例输出

2

【思路分析】

    说实话一开始看见这道题觉得是区间dp,but  ……这就很尴尬了

  • 还是逐步分析吧,首先从最初情况入手,i个人,至多i个大巴(显然不会用这么多,但是要在此基础上处理),那么f[i]要怎么处理呢
  • 在前i个人中,不难发现可以乘坐大巴的情况有可能有很多,所有我们从1~j(j<=i)依次跑一边,看能否将其放在一个大巴里,如果可以,那(j,i)区的人用一个大巴就可以装下了,而(1,j)区间内已经处理好,直接拿过来就可以了,推出转移方程为 f[i] = max(f[i],f[j]+1),转移方程想好了,接下来的就比较简单了
  • 既然是对区间进行处理,那么我们记录数据就选择用前缀和数组,用前缀和数组H[i]记录H方的人数,J[i]数组记录J方的人数,我们只需找出哪些区间里的人可以乘坐一辆大巴就行了,分为两种:

     1.整个大巴上都是同一个球队的球迷,那显然(j,i)区间的长度,就是H数组或J数组在这个区间内的个数:

       合法条件为:H[j] - H[i-1] == j-i+1 || J[j] - J[i-1] == j-i+1

     2.大巴上有两个球队的球迷,那在(i,j)区间内两个数组的差值就要小于等于D:

       合法条件为:abs(J[j]-J[i-1]-(H[j]-H[i-1])) <= d

细节见代码注释

【代码】

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = +;
int n,d;
int f[N],H[N],J[N],v[N][N];
int main(){
scanf("%d%d",&n,&d);
for(int i = ;i <= n;i++){
char c;scanf(" %c",&c); //注意加空格!!!
if(c=='H'){ //前缀和数组依次赋值
H[i] = H[i-]+;
J[i] = J[i-];
}
else{
J[i] = J[i-]+;
H[i] = H[i-];
}
f[i] = i;
}
for(int i = ;i <= n;i++){//找出可以乘坐同一辆大巴的区间
for(int j = i;j <= n;j++){ //关键点,注意下标不要弄错,减去的是H[i-1]或J[i-1],差值减去的也同样是i-1,才能代表(i,j)区间
if(H[j] - H[i-] == j-i+ || J[j] - J[i-] == j-i+ || abs(J[j]-J[i-]-(H[j]-H[i-])) <= d){
v[i][j] = ;
}
}
}
for(int i = ;i <= n;i++){ //dp环节
for(int j= ;j <= i;j++){
if(v[j][i])f[i] = min(f[i],f[j-]+);//这是减去j-1,查错查了半天
}
}
printf("%d",f[n]);
return ;
}

看球的巴士——线性dp的更多相关文章

  1. 【洛谷2113】看球泡妹子 DP背包

    看球泡妹子 题目背景 2014年巴西世界杯开幕了,现在满城皆是世界杯,商家们利用它大赚一笔,小明和小红也借此机会增进感情. 题目描述 本届世界杯共有\(N\)支球队,\(M\)场比赛.男球迷小明喜欢看 ...

  2. 背包DP【洛谷P2113】 看球泡妹子

    P2113 看球泡妹子 题目背景 2014年巴西世界杯开幕了,现在满城皆是世界杯,商家们利用它大赚一笔,小明和小红也借此机会增进感情. 题目描述 本届世界杯共有N支球队,M场比赛.男球迷小明喜欢看比赛 ...

  3. 线性dp

    线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...

  4. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  5. 动态规划_线性dp

    https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...

  6. POJ2779 线性DP 或 杨氏三角 和 钩子公式

    POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...

  7. 线性DP总结(LIS,LCS,LCIS,最长子段和)

    做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...

  8. 【动态规划】mr354-坐车看球

    [题目大意] 两个球队的支持者要一起坐车去看球,他们已经排成了一列.我们要让他们分乘若干辆巴士,同一辆巴士上的人必须在队伍中是连续的.为了在车上不起冲突,希望两队的支持者人数尽量相等,差至多是D.有一 ...

  9. [洛谷P2113] 看球泡妹子

    洛谷题目链接:看球泡妹子 题目背景 2014年巴西世界杯开幕了,现在满城皆是世界杯,商家们利用它大赚一笔,小明和小红也借此机会增进感情. 题目描述 本届世界杯共有N支球队,M场比赛.男球迷小明喜欢看比 ...

随机推荐

  1. Java实现蓝桥杯二项式的系数规律

    二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学家杨辉1261年所著的<详解九章算法>一书里就出现了. 其排列规律: 1 1 1 2 1 3 3 1 4 6 4 ...

  2. Maven发布Release到中心仓库历程记录(无个人域名)

    Maven发布Release到中心仓库历程记录(无个人域名) 前言 因为前段时间自己做了一个爬虫项目(地址),自己很希望分享到maven中心仓库上,感觉拥有自己的jar包令我兴奋,便开始了maven发 ...

  3. 5分钟速成Markdown

    一.认识 Markdown Markdown 是一种用来写作的轻量级「标记语言」,它用简洁的语法代替排版,而不像一般我们用的字处理软件 Word 或 Pages 有大量的排版.字体设置.它使我们专心于 ...

  4. jQuery实现瀑布流布局

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. mysql常见聚合函数

    count():总数量avg():平均数std():标准差sum():求和max():最大值min():最小值 上面的不过多介绍group_concat():分组列值全部展示到一行eg:mysql&g ...

  6. 5、vue的传值

    1-父组件向子组件  -父组件向孙子组件传值(属性传值) //父组件<template> <div id='app'> <headera v-bind:hea=" ...

  7. 掌握SpringBoot-2.3的容器探针:实战篇

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:原创文章分类汇总,及配套源码,涉及Java.Docker.K8S.DevOPS等 经过多篇知识 ...

  8. 2020/06/05 JavaScript高级程序设计 函数表达式

    函数表达式 函数定义的两种方式: 函数声明(函数声明提升,非标准name属性可访问给函数指定的名字) 函数声明提升:执行代码前先读取函数声明 function functionName(arg0, a ...

  9. php 常用的redis操作语法

    String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 $redis-> ...

  10. python+selenium识别图片验证码

    import timeimport pytesseractfrom PIL import Image, ImageEnhancefrom selenium import webdriver url = ...