传送门:>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. Consecutive Subsequence CodeForces - 977F (map优化DP)·

    You are given an integer array of length nn. You have to choose some subsequence of this array of ma ...

  2. openstack-虚拟化模型

    一. 虚拟化模型 1.虚拟化模型 图1 虚拟化模型 图2 KVM架构 2.KVM模块 处理器虚化 内存虚化 3.QEMU设备模型 其它虚化(网卡.声卡.显卡等)

  3. pdf转eps后存在大片空白的处理

    之前pdf转eps的方式是用acrobat直接转,发现每次转完后,图片都显示在一张A4纸上,插入到论文中时会出现大片空白:但在pdf中是没有这么多空白的,与裁剪没关系. 后来在 http://tex. ...

  4. stark组件的增删改

      1.效果图 2.详细步骤解析 3.总结.代码   1.效果图 增 删除 改 2.详细步骤解析 1.构造增删改查url,反向解析 2.ModelForm定制add.edit页面 3.starak中的 ...

  5. 测试python最大递归层次

    转自:https://www.cnblogs.com/xiongdashuai/p/6243372.html python默认的最大递归层数: 运行环境:Windows 7,x64python环境:p ...

  6. 数据处理 array json 格式 转换成 数组形式

    处理这种数据应该使用的方式是 this.cities= res.data.data.cities.sort((a,b)=>{ //排序 进行字母排序 return a.pinyin[0].cha ...

  7. 为什么js中要用void 0 代替undefined

    这个是Backbone.js中的一句源码 if (callback !== void 0 && 'context' in opts && opts.context == ...

  8. MySQL客户端工具及SQL

    一.客户端命令介绍 mysql  mysqladmin mysqldump mysql 1.用于数据库的连接管理 2. mysqladmin 1. 2. mysqldump 1. 2.

  9. mac 中登陆mysql忘记密码解决办法

    1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter password: ERROR 1045 (2 ...

  10. python数据结构与算法第六天【栈与队列】

    1.栈和队列的原理 栈:后进先出(LIFO),可以使用顺序表和链表实现 队列:先进先出(FIFO),可以使用顺序表和链表实现 2.栈的实现(使用顺序表实现) #!/usr/bin/env python ...