BZOJ1915: [Usaco2010 Open]奶牛的跳格子游戏
权限题,没有传送门。
这很显然是一道DP题,刚看完题目可能会比较懵逼。这道题如果不要求回去,那么就是一道很裸的DP题。但是本题要求回去而且回去的格子的前一个格必须是之前经过的。
先不考虑回去的路程,对于一段长度在$K$之内的区间,其中的所有值为正数的点都是可以到达的。所以先搞个前缀和:
$sum_i= \sum _{j=1}^i a_j \times [a_j>0]$
这个搞完后如果不算回来的,可以得到以下转移方程:
$f[i]=max \{ f[j]+sum[i-1]-sum[j] \}$
其实到这一步,带上回去的状态转移方程也很显然了。
$f[i]=max \{f[j]+sum[i-2]-sum[j]+a[i]+a[i-1] \}$
表示第$i$个点为去时经过的点且会返回的前一个点,$sum[]$和$f[]$均存在单调性,所以可以用单调队列优化决策单调性,使得总体复杂度降为$O(N)$。
但是$f[i]_{max}$并不是最后的答案,因为对于任意一个点$i$,$[i+1,i-1+K]$都是可以到达的,所以要把这一段对答案的贡献也累加上。
在具体实现时,注意单调队列在DP前应进队0和1,因为第0个点不是必须停留的点。
//BZOJ 1915
//by Cydiater
//2016.10.6
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <map>
#include <iomanip>
#include <cstdlib>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
const int MAXN=3e6+5;
const int oo=0x3f3f3f3f;
inline ll read(){
char ch=getchar();ll x=0,f=1;
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll N,K,sum[MAXN],a[MAXN],q[MAXN],head,tail,f[MAXN],ans=0;
namespace solution{
void init(){
memset(sum,0,sizeof(sum));
N=read();K=read();
up(i,1,N)a[i]=read();
up(i,1,N)sum[i]=sum[i-1]+(a[i]>0?a[i]:0);
}
void DP(){
head=1;tail=0;q[++tail]=0;q[++tail]=1;
up(i,2,N){
while(head<tail&&i-q[head]>K)head++;
f[i]=f[q[head]]+sum[i-2]-sum[q[head]]+a[i]+a[i-1];
while(head<tail&&f[i]-f[q[tail]]>sum[i]-sum[q[tail]])tail--;
q[++tail]=i;
}
up(i,1,N)ans=max(ans,f[i]+((i-1+K<=N)?(sum[i-1+K]-sum[i]):(sum[N]-sum[i])));
}
void output(){
cout<<ans<<endl;
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
init();
DP();
output();
return 0;
}
BZOJ1915: [Usaco2010 Open]奶牛的跳格子游戏的更多相关文章
- 【BZOJ1915】[Usaco2010 Open]奶牛的跳格子游戏 DP+单调队列
[BZOJ1915][Usaco2010 Open]奶牛的跳格子游戏 Description 奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3 <= ...
- BZOJ_1915_[Usaco2010 Open]奶牛的跳格子游戏_DP+单调队列
BZOJ_1915_[Usaco2010 Open]奶牛的跳格子游戏_DP+单调队列 Description 奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子, ...
- 2018.10.14 bzoj1915: 奶牛的跳格子游戏(单调队列优化dp)
传送门 NOIP练习题. f[i]f[i]f[i]表示去的时候选了iii且回来的时候第一步走的是i−1i-1i−1的最优值. 显然f[i]=maxf[i]=maxf[i]=max{f[j]−sum[j ...
- BZOJ1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏
1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5 ...
- bzoj:1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏
Description 奶牛们又在玩一种无聊的数字游戏.输得很郁闷的贝茜想请你写个程序来帮她在开局时预测结果.在游戏的开始,每头牛都会得到一个数N(1<=N<=1,000,000).此时奶 ...
- 【BZOJ】1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏(刷水严重)
http://www.lydsy.com/JudgeOnline/problem.php?id=1666 这种我就不说了.. #include <cstdio> #include < ...
- 1861 奶牛的数字游戏 2006年USACO
codevs——1861 奶牛的数字游戏 2006年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Descript ...
- BZOJ2097[Usaco2010 Dec] 奶牛健美操
我猜我这样继续做水题会狗带 和模拟赛的题很像,贪心搞一下. #include<bits/stdc++.h> using namespace std; int read(){ ,f=;cha ...
- 【BZOJ】1666 [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏
[算法]贪心&&堆 [题解]反过来看就是合并任意两块木板,花费为木板长度之和. 显然从最小的两块开始合并即可,用堆(优先队列)维护. 经典DP问题石子归并是只能合并相邻两堆石子,所以不 ...
随机推荐
- test2
package com.analysis.code; import org.apache.commons.lang3.StringUtils; import java.io.*; import jav ...
- [codeforces 519E]E. A and B and Lecture Rooms(树上倍增)
题目:http://codeforces.com/problemset/problem/519/E 题意:给你一个n个点的树,有m个询问(x,y),对于每个询问回答树上有多少个点和x,y点的距离相等 ...
- 安全模式下运行Windows installer并卸载程序
[安全模式] 打开命令行 执行 REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal\MSIServer" ...
- 由Nullable模式想到的ToString的扩展
虽然关于null的一切争论永不停息,但根据实际开发经历,很多时候需要判断无聊的null,并且有些的判断是可有可无的,尤其是在表现层. string e = null; if (e != null) { ...
- hdu3555 数位dp
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- linux 命令行下更换软件源
首先备份默认源: sudo cp /etc/apt/sources.list /etc/apt/sources.list.old 清空默认源: sudo cat /dev/null > /etc ...
- bzoj 3743
这道题用到了4个dfs,分别是找出所有家的最小生成树,找出一点距离树的最小距离,找出每个点儿子距离的最大值(不包括父亲,也就是指不包括根节点的子树),用父亲的值来更新自己 因为我们可以知道:如果我们在 ...
- Elasticsearch 1.X 版本Java插件开发
接上一篇<Elasticsearch 2.X 版本Java插件开发简述> 开发1.X版本elasticsearch java插件与2.X版本有一些不同,同时在安装部署上也有些不同,主要区别 ...
- WordPress 博客文章时间格式the_time()设置
国外设计的WordPress 主题里的文章的时间格式是类似“十一月 21, 2010”这种格式的,而中国人习惯的是年在前,月紧跟其后,日在末尾,所以看国外的就显得很别扭,但是我们可以通过修改WP时间代 ...
- WordPress翻译中 __()、_e()、_x、_ex 和 _n 的用法及区别
编译函数 WordPress使用了下面几个函数来方便语言本地化. __() _e() _x() _ex() _n() 以上所列的函数是用来包含所需翻译的字符串的,根据字符串的不同参数和输出类型,需要使 ...