传送门:>Here<

题意:不能有连续超过$k$个奶牛的一段,求最大的和

思路分析

Dp还是容易看出来的。

我的第一感觉是一维,$f[i]$表示前i头奶牛的最大效率。其实这也是可以解的,具体方法将会在后文介绍。

考虑二维的解法,$f[i][0]$表示奶牛i不参与时的最大效率,$f[i][1]$表示奶牛i参与。我们知道,在前$k$头奶牛中必定有一头奶牛不参与——对于$f[i][0]$转移很简单,由于奶牛$i$不参与,一定是选择继承,所以必定有$$f[i][0] = Max(f[i-1][0], f[i-1][1])$$. 而$f[i][1]$可以利用$f[i-j][0]$(0<j<K)来转移:$$f[i][1] = Max(f[i-j][0] + sum[i] - sum[i-j])$$

这个方程的意思就是$i-j$这头奶牛不选,并继承最优子结构$f[i-j][0]$,然后$i-j$之后的奶牛全部选择,于是用一个前缀和来维护即可。整理方程发现,$sum[i]$是确定的,于是可以将它提出$Max$之外,得到$$f[i][1] = Max(f[i-j][0] - sum[i-j]) + sum[i]$$我们发现这个方程就只与i-j有关了,并且是个定长区间的最大值——很容易让我们联想到滑动窗口问题,于是通过单调队列来解决就好了。

下面的代码贴的是以上之中方法……

刚才我们提到了可以用一维来解决,即$f[i]$表示前$i$头奶牛的最大效率。其实是与二维一模一样的,二维实在是多此一举。由于$i-j$根本不选,我们可以直接继承$f[i-j-1]$,在加上前缀和,就有了方程$$f[i][1] = Max(f[i-j-1] - sum[i-j]) + sum[i]$$

Code

  long long

/*By QiXingzhi*/
#include <cstdio>
#define  N  (100010)
#define  INF   (0x3f3f3f3f)
#define  Max(a,b)  (((a)>(b)) ? (a) : (b))
#define  Min(a,b)  (((a)<(b)) ? (a) : (b))
#define  r read()
typedef long long ll;
#define int ll
using namespace std;
inline int read(){
    ; ; register int c = getchar();
    ')) c = getchar();
    , c = getchar();
    ) +(x << ) + c - ', c = getchar();
    return x * w;
}
,t;
],q[N],s[N];
inline void Push(int w){
    ]-s[w] > f[q[t]][]-s[q[t]]) --t;
    q[++t] = w;
}
#undef int
int main(){
#define int ll
    n=r,k=r;
    ; i <= n; ++i){
        a[i]=r;
        s[i] = s[i-]+a[i];
    }
    f[][] = ;
    f[][] = a[];
    Push();
    Push();
    ; i <= n; ++i){
        f[i][] = Max(f[i-][], f[i-][]);
        while(h<=t && q[h] < i-k) ++h;
        f[i][] = f[q[h]][] + s[i] - s[q[h]];
        Push(i);
    }
    printf(],f[n][]));
    ;
}

[洛谷P2627] 修剪草坪的更多相关文章

  1. 洛谷 P2627 修剪草坪 题解

    P2627 修剪草坪 题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Fa ...

  2. P2627 修剪草坪

    P2627 修剪草坪 题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Fa ...

  3. luogu P2627 修剪草坪

    传送门 单调队列优化dp板子 表示不大想写详细做法,自己看代码吧qwq (懒) 注意细节,不然就会跟我一样WA4次 // luogu-judger-enable-o2 #include<bits ...

  4. P2627 修剪草坪 (单调队列优化$dp$)

    题目链接 Solution 70分很简单的DP,复杂度 O(NK). 方程如下: \[f[i][1]=max(f[j][0]+sum[i]-sum[j])\]\[f[i][0]=max(f[i-1][ ...

  5. 洛谷P2627 [USACO11OPEN]Mowing the Lawn G (单调队列优化DP)

    一道单调队列优化DP的入门题. f[i]表示到第i头牛时获得的最大效率. 状态转移方程:f[i]=max(f[j-1]-sum[j])+sum[i] ,i-k<=j<=i.j的意义表示断点 ...

  6. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  7. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. C\S 架构 DNS服务器 交换机 路由器

    ------------------------只有不快的斧,没有劈不开的柴;只有想不到的人,没有做不到的事.想干总会有办法,不想干总会有理由!# -------------------------- ...

  2. ios 后台下载,断点续传总结

    2018年12月05日 16:09:00 weixin_34101784 阅读数:5 https://blog.csdn.net/weixin_34101784/article/details/875 ...

  3. Python之操作Excel

    使用之前先导入三个模块: import xlwt #只能写Excel import xlrd #只能读Excel import xlutils #修改Excel,在原来的基础上修改 一.写EXCEL ...

  4. JSP 快速入门

    目录 生命周期 9大对象 常用指令 基本语法 表达式语言(EL) jstl介绍 常用的jstl标签 生命周期 我们虽然写的是jsp,代码中包含了html.css.js,以及Java代码,但是真正执行的 ...

  5. 【学习总结】Master课程 之 虚拟化与云计算

    Section 1- Cloud Computing Introduction-云计算介绍 1-What can Cloud Computing do? - 云计算可以做什么? 服务模式:美国国家标准 ...

  6. Linux 光盘挂载步骤

    mount -t fs_type device dir 挂载操作 常见的文件系统类型 Windows :ntfs.fat32 Linux:ext3.ext4.xfs 光盘: iso9660 挂载光盘: ...

  7. javascript博客爱心特效代码与代码解析

    这个鼠标点击出现爱心的特效经常在别的博客里见到,于是我查了度娘后拿来直接用上了. 虽然不知道原作者是谁,但肯定是个大神,只有通过观摩他/她的代码膜拜一下啦. 直接上代码(解析在代码注释里): // 自 ...

  8. Azure系列1.1.2 —— 用于 IntelliJ 的 Azure 工具包的登录说明

    (文中大部分内容(95%)Azure官网上有,我只是把我自己实际操作中遇到的问题在这里阐述一下.) 先决条件 若要完成文章中的步骤,需要安装用于 IntelliJ 的 Azure 工具包,该工具包需要 ...

  9. 《Effective C++》让自己习惯C++:条款1-条款4

    条款1:视C++为一个语言联邦 可以将C++分为4个层次: 1.C:C++实在C语言的基础上发展而来的. 2:Object-Oriented C++:C++面向对象. 3:Template C++:C ...

  10. Prime Permutation

    Prime Permutation 原题地址: http://codeforces.com/problemset/problem/123/A 题目大意: 给你一个字符串(只包含小写字母),从1开始存放 ...