[USACO10OPEN]牛跳房子Cow Hopscotch
题目描述
奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶
牛们在草地上画了一行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的更多相关文章
- 【洛谷】2990:[USACO10OPEN]牛跳房子Cow Hopscotch【单调队列优化DP】
P2990 [USACO10OPEN]牛跳房子Cow Hopscotch 题目描述 The cows have reverted to their childhood and are playing ...
- 洛谷 P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)
P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold) 就像人类喜欢跳格子游戏一样,FJ的奶牛们发明了一种新的跳格子游戏.虽然这种接近一吨的笨拙的动物玩跳格子游戏几 ...
- Cow Hopscotch
Cow Hopscotch 题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have inv ...
- bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch
Description 就像人类喜欢玩"跳房子"的游戏,农民约翰的奶牛已经发明了该游戏的一个变种自己玩.由于笨拙的动物体重近一吨打,牛跳房子几乎总是以灾难告终,但这是没有阻止奶牛几 ...
- P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...
- bzoj1638 / P2883 [USACO07MAR]牛交通Cow Traffic
P2883 [USACO07MAR]牛交通Cow Traffic 对于每一条边$(u,v)$ 设入度为0的点到$u$有$f[u]$种走法 点$n$到$v$(通过反向边)有$f2[v]$种走法 显然经过 ...
- bzoj1650 / P2855 [USACO06DEC]河跳房子River Hopscotch / P2678 (noip2015)跳石头
P2855 [USACO06DEC]河跳房子River Hopscotch 二分+贪心 每次二分最小长度,蓝后检查需要去掉的石子数是否超过限制. #include<iostream> #i ...
- P3014 [USACO11FEB]牛线Cow Line && 康托展开
康托展开 康托展开为全排列到一个自然数的映射, 空间压缩效率很高. 简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(k\) 大, 这个 \(k\) 即是次全排列的康托展开. 康托 ...
- 【BZOJ3939】[Usaco2015 Feb]Cow Hopscotch 动态规划+线段树
[BZOJ3939][Usaco2015 Feb]Cow Hopscotch Description Just like humans enjoy playing the game of Hopsco ...
随机推荐
- Codeforces1151E,F | 553Div2 | 瞎讲报告
传送链接 E. Number of Components 当时思博了..一直在想对于\([1,r]\)的联通块和\([1,l-1]\)的联通块推到\([l,r]\)的联通块...我真的是傻了..这题明 ...
- PLSQL Developer windows 64位连接数据库的问题
使用PLSQL Developer 工具连接到数据库进行开发,目前主流windows 系统都是64位操作系统,而PLSQL Developer 只有32位程序,所以在连接数据库上遇到一些问题. PL ...
- 字幕字体滚动插件——scroxt.js
README scroxt.js Overview scroxt.js是一个字体滚动的插件库,包括视频弹幕滚动,直播弹幕.直播弹幕强制模式.单行水平左右滚动.文本垂直滚动上下,用于简单快捷生成滚动字体 ...
- 看oracle的sid
ps -ef|grep pmon 可以从进程名字里看到 也可以通过 sqlplus / as sysdbashow parameter instance_name
- OO第四次作业-对前三次作业总结
第一次作业由于直接没怎么学过java,全靠一星期速成,前几天看了java的语法,但是因为光看没有打代码,学习效果并不是特别好.由面向过程转向面向对象,不是特别清楚该怎么办,虽然写的是两个类,但实际上是 ...
- java实验五实验报告
一.实验内容 Cmp传输与加解密 结对编程,一人服务器,一人客户端,服务器向客户端发送经RSA加密的密钥和用密钥加密的密文(使用DES算法),客户端负责接收加密后的密钥和密文,并解密得出明文. 二.实 ...
- My Sql数据库设置环境变量和字符集
一.踩坑背景 之前开发中一直用的是sql server 数据库,最近接到公司一个老的项目,用的my sql数据库做的,功能做了一大部分,现在客户要求对原程序和数据库进行服务器的迁移工作.产品经理给出 ...
- Sprint计划(未完成)
1.需求预计:http://www.cnblogs.com/OuZeBo/p/4529320.html 2.功能设计: 3.Spring计划:
- windows redis 后台运行
1. 进入 DOS窗口2. 在进入Redis的安装目录3. 输入:redis-server --service-install redis.windows.conf --loglevel verbos ...
- git学习-综合性文章
文章:[转载]理解 Git 分支管理最佳实践 首先介绍了git各种分支: