题目描述

奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶

牛们在草地上画了一行N个格子,(3 <=N <= 250,000),编号为1..N。

就像任何一个好游戏一样,这样的跳格子游戏也有奖励!第i个格子标有一个数字V_i(-2,000,000,000 <=V_i <= 2,000,000,000)表示这个格子的钱。奶牛们想看看最后谁能得到最多的钱。

规则很简单:

* 每个奶牛从0号格子出发。(0号格子在1号之前,那里没钱)

* 她向N号格子进行一系列的跳跃(也可以不跳),每次她跳到的格子最多可以和前一个落脚的格子差K格(2 <= K <= N)(比方说,当前在1号格,K=2, 可以跳到2号和3号格子)

*在任何时候,她都可以选择回头往0号格子跳,直到跳到0号格子。另外,除了以上规则之外,

回头跳的时候还有两条规则:

*不可以跳到之前停留的格子。

*除了0号格子之外,她在回来的时候,停留的格子必须是恰巧过去的时候停留的某个格子的前一格(当然,也可以跳过某些过去…

(必须最后要跳回来)

题解:
往回跳是一个挺麻烦的事情。

发现,如果不是一下回到0的话,一定会在某一个位置i的前一个位置作为回来的停留

因为不能记录来的路上哪些点没有走过,

所以我们还可以过去的时候,就把回来的路径上的点贡献统计上。

似乎只能dp了、

由于有负数,所以不是停留的格子越多越好。

为了避免选择i的前一个格子是否要停留,

我们设f[i],表示,从0跳到i,往后再跳一些(距离i不能超过k-1),然后返回到i-1,然后再回到0的最优收益。

就是说,我们钦定i-1是返回的路径上第一个回来的点。

而且,我们每跳k个距离,就必须留下一个点作为回来的点。

那么,f[i]=max(f[j]+s[i-2]-s[j]+v[i]+v[i-1]) (i-k<=j<=i-2)就是从j一步跳到i

s[k]表示,前k个位置,大于0的数的前缀和。因为不超过k距离下,随便收钱必然找正数 。

j的范围很经典了,简单又自然地,单调队列优化一下f就可以

统计答案的时候,并不是mx(f[i])

因为i还可以往后捞点钱,再回到i-1,所以,f[i]再加上s[min(i+k-1,n)]-s[i]

然后一个锅就是:

我们的讨论有一个大前提。"如果不是一下回到0的话,一定会在某一个位置i的前一个位置作为回来的停留"

那么如果最优解是跳过去,然后一步回到0,就挂了。

所以,f[0]=s[min(0+k),n]也要取进ans的mx里。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=(1LL*<<);
const int N=+;
int n,k;
ll f[N];
ll v[N],s[N];
int q[N],l,r;
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%lld",&v[i]);
s[i]=s[i-]+(v[i]>)*v[i];
}
l=,r=;
f[]=v[];
q[++r]=;
for(int i=;i<=n;i++){
while(l<=r&&q[l]<i-k) l++;
f[i]=f[q[l]]-s[q[l]]+v[i]+v[i-]+s[i-];
while(l<=r&&(f[q[r]]-s[q[r]])<=(f[i-]-s[i-])) r--;
q[++r]=i-;
}
ll ans=;
for(int i=;i<=n;i++) ans=max(ans,f[i]+s[min(n,i+k-)]-s[i]);
ans=max(ans,f[]+s[min(n,k)]-s[]);
printf("%lld",ans);
return ;
}

总结:

像这种题,确实看起来无从下手,主要是回来的路径怎么考虑上?

但是利用回来的路径必须是i的前面一个位置,所以,可以钦定回来的位置,然后就可以dp了。

注意边界的细节问题。

[USACO10OPEN]牛跳房子Cow Hopscotch的更多相关文章

  1. 【洛谷】2990:[USACO10OPEN]牛跳房子Cow Hopscotch【单调队列优化DP】

    P2990 [USACO10OPEN]牛跳房子Cow Hopscotch 题目描述 The cows have reverted to their childhood and are playing ...

  2. 洛谷 P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)

    P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold) 就像人类喜欢跳格子游戏一样,FJ的奶牛们发明了一种新的跳格子游戏.虽然这种接近一吨的笨拙的动物玩跳格子游戏几 ...

  3. Cow Hopscotch

    Cow Hopscotch 题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have inv ...

  4. bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch

    Description 就像人类喜欢玩"跳房子"的游戏,农民约翰的奶牛已经发明了该游戏的一个变种自己玩.由于笨拙的动物体重近一吨打,牛跳房子几乎总是以灾难告终,但这是没有阻止奶牛几 ...

  5. P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)

    P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...

  6. bzoj1638 / P2883 [USACO07MAR]牛交通Cow Traffic

    P2883 [USACO07MAR]牛交通Cow Traffic 对于每一条边$(u,v)$ 设入度为0的点到$u$有$f[u]$种走法 点$n$到$v$(通过反向边)有$f2[v]$种走法 显然经过 ...

  7. bzoj1650 / P2855 [USACO06DEC]河跳房子River Hopscotch / P2678 (noip2015)跳石头

    P2855 [USACO06DEC]河跳房子River Hopscotch 二分+贪心 每次二分最小长度,蓝后检查需要去掉的石子数是否超过限制. #include<iostream> #i ...

  8. P3014 [USACO11FEB]牛线Cow Line && 康托展开

    康托展开 康托展开为全排列到一个自然数的映射, 空间压缩效率很高. 简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(k\) 大, 这个 \(k\) 即是次全排列的康托展开. 康托 ...

  9. 【BZOJ3939】[Usaco2015 Feb]Cow Hopscotch 动态规划+线段树

    [BZOJ3939][Usaco2015 Feb]Cow Hopscotch Description Just like humans enjoy playing the game of Hopsco ...

随机推荐

  1. sar命令详解

    基础命令学习目录首页 原文链接:http://lovesoo.org/linux-sar-command-detailed.html sar(System Activity Reporter系统活动情 ...

  2. Python入门学习系列——Python文件和异常

    从文件中读取数据 首先准备一个文本文件,文件中存储着普通文本数据.读取文件需要调用open()和read()函数. 读取整个文件 代码示例: with open('pi_digits.txt') as ...

  3. PHP中 post方法 与 get方法 的区别

    1.Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如[url]http://www.domain.co ...

  4. 第33次Scrum会议(11/21)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/21 11:35~11:57,总计22min.地点:东北 ...

  5. 王者荣耀交流协会final发布第五次scrum例会

    1.例会照片 成员高远博,冉华,王磊,王玉玲,任思佳,袁玥,王磊,王超. master:王磊 2.时间跨度 2017年12月5日 18:00 — 18:21,总计21分钟 3.地点 一食堂二楼沙发座椅 ...

  6. 对视频播放软件KMplayer的评价

    刚进入大一的时候接触到了KMplayer,由于当时收集了不同格式的电影视频却没有合适的播放器播放出来,后来在网上知道了所谓的万能播放器的KMplayer,下载用了过后,才知道这的确是一款万能播放器. ...

  7. windows下的C++ socket服务器(4)

    void handleAccept(int socket_fd) { ] = { '\0' }; string cmd; string filename; recv(socket_fd, buf, ) ...

  8. T4模板_T4基本结构

    T4文本模板由 指令块.文本块.控制块 组成. 一. 指令块(MSDN文本模板指令) 指令块以@开头,基本的指令块包括<#@ template #> .<#@ parameter# ...

  9. cxgrid中,如何根据列名或字段名取得footer值

    注意,不是根据index取得footer值cxgrdtbv1.DataController.Summary.FooterSummaryValues[0]; ------解决方案------------ ...

  10. [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手   http://www.52im.net/thread-1729-1-1.html     1.引言 网络编程中TCP协议的三次握手和 ...