题目描述

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

牛们在草地上画了一行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. 主成分分析——PCA

    在数据挖掘过程中,当一个对象有多个属性(即该对象的测量过程产生多个变量)时,会产生高维度数据,这给数据挖掘工作带来了难度,我们希望用较少的变量来描述数据的绝大多数信息,此时一个比较好的方法是先对数据进 ...

  2. [mysql] 归档工具pt-archiver,binlog格式由mixed变成row

    pt-archiver官方地址:https://www.percona.com/doc/percona-toolkit/3.0/pt-archiver.html 介绍:归档数据,比如将一年前的数据备份 ...

  3. 详细教你实现BST(二叉排序树)

    查找基本分类如下: 线性表的查找 顺序查找 折半查找 分块查找 树表的查找 二叉排序树 平衡二叉树 B树 B+树 散列表的查找 今天介绍二叉排序树. 二叉排序树 ( Binary Sort Tree ...

  4. Notes of Daily Scrum Meeting(11.13)

    Notes of Daily Scrum Meeting(11.13) 今天邹欣老师给我们讲课大家还是很有收获的,大家课堂的参与度确实有了很大的提升,而且邹欣老师关于项目Scrum Meeting报告 ...

  5. BeanUtils解决日期问题

    ConvertUtils.register(new DateLocaleConverter(), Date.class); BeanUtils.populate(user, request.getPa ...

  6. “私人助手”Beta版使用说明

    私人助手(Beta)版使用说明 私人助手这款软件是通过添加事件提醒功能,让用户能在正确的时间做正确的事情,使得工作变得更有效率,而这款软件的特色在于提醒模式的添加,用户可以通过震动.铃声提醒,我们的特 ...

  7. Hibernate笔记①--myeclipse制动配置hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JD ...

  8. PMS—团队展示

    点我查看作业原题 [队名] PMS(一群pm) [拟做的团队项目描述] 基于监控场景的视频摘要与人车检测跟踪系统 A system, under monitor scene, for video su ...

  9. Week4-作业1

    第四章        这一章主要讲了代码规范.复审和团队合作这两项内容.        在关于代码设计规范方面,书中讲到了关于goto的使用:        “函数最好有单一的出口,为了达到这一目的, ...

  10. JS计算两个日期之间的天数,时间差计算

    1.日期之间的天数计算 //计算天数差的函数,通用 function DateDiff(sDate1, sDate2) { //sDate1和sDate2是2017-9-25格式 var aDate, ...