博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1915 [Usaco2010 Open]奶牛的跳格子游戏
阅读量:6943 次
发布时间:2019-06-27

本文共 1308 字,大约阅读时间需要 4 分钟。

BZOJ_1915

    如果我们把一对相邻的来去经过的格子看成一个研究对象的话,那么相邻研究对象之间距离不超过K,而且相邻研究对象之间所有正数的格子都可以在向前跳的过程中经过。抽象成这样的模型之后就可以用单调队列+dp搞定最后一个研究对象在位置i时的最优解。这时由于在向前跳的过程中还可能经过最右边研究对象的右边的一些距离不超过K-1的正数的格子,最后扫一遍dp出的最优解,将这些格子一并加起来即可。

#include
#include
#include
#define MAXD 250010#define inf 0xc3c3c3c3c3c3c3c3lltypedef long long LL;int a[MAXD], N, K, q[MAXD];LL A[MAXD], dp[MAXD];void init(){ A[0] = 0; for(int i = 1; i <= N; i ++) { scanf("%d", &a[i]); A[i] = A[i - 1]; if(a[i] > 0) A[i] += a[i]; }}void solve(){ if(K == 1) { printf("%d\n", std::max(0, a[1])); return ; } int front = 0, rear = 0; memset(dp, 0xc3, sizeof(dp[0]) * (N + 1)); dp[0] = 0; for(int i = 2; i <= N; i ++) { while(front < rear && dp[q[rear - 1]] - A[q[rear - 1]] <= dp[i - 2] - A[i - 2]) -- rear; q[rear ++] = i - 2; while(front < rear && q[front] < i - K) ++ front; dp[i] = dp[q[front]] + a[i] + a[i - 1] + A[i - 2] - A[q[front]]; } LL ans = std::max(0ll, A[K]); for(int i = 1; i <= N; i ++) { int j = std::min(N, i + K - 1); ans = std::max(ans, dp[i] + A[j] - A[i]); } printf("%lld\n", ans);}int main(){ while(scanf("%d%d", &N, &K) == 2) { init(); solve(); } return 0;}

 

 

转载地址:http://zennl.baihongyu.com/

你可能感兴趣的文章
Weblogic10 集群配置
查看>>
《OSPF网络设计解决方案(第2版)》一1.5 网络拓扑类型
查看>>
图解 Java IO : 一、File源码
查看>>
iOS 安全之针对 mach_portal 的分析
查看>>
Java数组
查看>>
ROS机器人程序设计(原书第2版)1.2.7 安装rosinstall
查看>>
《“笨办法”学Ruby》(第3版)—习题2 注释和#号
查看>>
Java Reflection(三):构造器
查看>>
RHCSA 系列(十二): 使用 Kickstart 完成 RHEL 7 的自动化安装
查看>>
《C++面向对象高效编程(第2版)》——3.9 类可以包含什么
查看>>
《响应式Web设计全流程解析》一1.6 压死骆驼的稻草
查看>>
New road
查看>>
第一个计算出地球周长的人——埃拉托色尼
查看>>
PostgreSQL修炼之道:从小工到专家. 3.6 小结
查看>>
Ceph分布式存储实战3.2 CRUSH基本原理
查看>>
想知道的都在这里,分布式离线关系型计算最全总结
查看>>
《21天学通HTML+CSS+JavaScript Web开发(第7版)》——2.2 为发布到Web准备好计算机...
查看>>
Linux 产能工具及其使用技巧
查看>>
Apache Kylin权威指南3.4 管理Cube碎片
查看>>
ROS机器人程序设计(原书第2版)2.1.1 工作空间
查看>>