------------
思路:dp
用一个dp数组存到i为止的最大功效\
根据题目描述不能让超过k个奶牛连续起来,那么第i个奶牛要么不取,要么从i-k枚举到i枚举以i为尾的连续的奶牛的所有情况,就可以得出状态转移方程
dp[i]=max((E[i]+E[i-1]+...+E[i-k]+dp[i-k-2]),(E[i]+E[i-1]+...+E[i-k+1]+dp[i-k-1]),...,(E[i]+dp[i-2]),dp[i-1])
看着n和k的数据范围,再看看状态转移方程,满篇都写着三个字TLE
那么,就要思考优化
显而易见的,可以用前缀和对状态转移方程进行优化,把求区间和的部分优化到O(1);
这是优化后的状态转移方程(sum为前缀和数组)
dp[i]=max((sum[i]-sum[i-k-1]+dp[i-k-2]) , (sum[i]-sum[i-k]+dp[i-k-1])...(sum[i]-sum[i-1]+dp[i-2]),(sum[i]-sum[i]+dp[i-1]))
不难发现,sum[i]是固定的,变化的只有dp[j]-sum[j+1],要dp[i]最大,只要dp[j]-sum[j+1]最大就行\
那么可以开一个单调队列,维护i到i-k区间内的dp[j]-sum[j+1]的最大值,这样对于dp[i]的求值就可以优化到O(1);\
以下AC代码

--------------------------------------------------------------------------------------------------------------------------------

#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
long long a[N],sum[N],dp[N];//a储存原数组,sum储存前缀和(为啥不直接用原数组储存前缀和)
struct node{long long num,s;
};
long long ans=LONG_LONG_MIN,n,m;
deque<node> q;
int  main(){cin>>n>>m;for(int i=1;i<=n;i++){ans=max(ans,a[i]);cin>>a[i];sum[i]=a[i]+sum[i-1];//求前缀和 }for(int i=0;i<=n;i++){if(q.front().num+m<i)q.pop_front();//判断队首是否可用 long long t=0;if(i>=1)t=dp[i-1]-sum[i];ans=max(ans,sum[i]+q.front().s);//防止自己加自己 while(q.size()){//维护单调队列 if(q.back().s<=t)q.pop_back();else break;}q.push_back((node){i,t});//入队 dp[i]=ans;//赋值(为啥不放上面) }cout<<ans;return 0;
}

P2627 [USACO11OPEN]Mowing the Lawn G 题解(单调队列+dp)相关推荐

  1. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  2. P3580 [POI2014]ZAL-Freight(单调队列dp)

    P3580 [POI2014]ZAL-Freight(单调队列dp) 考虑两辆车怎么样是最优的. t1,t2,St_1,t_2,St1​,t2​,S t1+St_1+St1​+S 第一辆车:[t1,t ...

  3. 洛谷 P4544 [USACO10NOV]Buying Feed G)(单调队列优化DP)

    题目链接:P4544 [USACO10NOV]Buying Feed G 建议做这题前先做下这题P1886 滑动窗口 /[模板]单调队列 我们可以用dp[i][j]表示当前走到前i个点,已经买了j吨饲 ...

  4. ACM-ICPC 2018 徐州赛区网络预赛G (单调队列)

    传送门 题面: There's a beach in the first quadrant. And from time to time, there are sea waves. A wave (  ...

  5. 区间划定最小值题解--单调队列

    滑动窗口求区间最小值–单调队列 题目如下----转自洛谷 题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若 ...

  6. 刷题总结——烽火传递(单调队列+dp)

    题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...

  7. AcWing135.最大子序和(单调队列DP)

    题目传送门 输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列,使得子序列中所有数的和最大. 注意: 子序列的长度至少是1. 输入格式 第一行输入两个整数n,m. 第二行输入n个数,代表 ...

  8. AcWing1087.修剪草坪(单调队列DP)

    题目传送门 在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪. 现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠. 然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的 ...

  9. AcWing1090.绿色通道(单调队列DP)

    题目传送门 高二数学<绿色通道>总共有 nn 道题目要抄,编号 1,2,-,n,抄第 i 题要花 ai 分钟. 小 Y 决定只用不超过 t 分钟抄这个,因此必然有空着的题. 每道题要么不写 ...

  10. AcWing1088.旅行问题(单调队列DP)

    题目传送门 John 打算驾驶一辆汽车周游一个环形公路. 公路上总共有 n 个车站,每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米. John 必须从某个车站出发,一直按顺时针( ...

最新文章

  1. 【机器学习】6大监督学习模型:毒蘑菇分类
  2. 金山称清理专家遭微软误杀:正积极协商解决
  3. ?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.
  4. ubuntu下安装opensips
  5. hp laser103 属性没有配置项_哦?在hp打印机面板上就可以更改打印机ip地址
  6. 1024看到这篇文章的程序员,能不能把你的电脑桌面右下角截图回复
  7. 如何使用Trie树,设计实践Google一样的输入提示功能
  8. [论文翻译] Active Learning by Feature Mixing
  9. Hadoop生态圈-Zookeeper的工作原理分析
  10. 虚拟机中qemu模拟开发板启动过程,使用nfs挂载根文件系统
  11. SurfaceView实例
  12. MAC中配置SDK环境变量
  13. Labview软件开发—界面切换—选项卡的应用
  14. wampserver图标为绿色,打开localhost页面错误提示:The requested URL / was not found on this server
  15. Jackknife 刀切法
  16. vue + elemen可远程搜索select选择器的封装(思路及源码分享)
  17. app推广:转化率低才是最大的浪费
  18. Vue(3)之 过滤器
  19. 《厚黑学》| 读书三诀
  20. (MATLAB与数学建模习题)不一样的十六进制

热门文章

  1. 什么是收集服务器配置信息,配置rsyslog服务器收集Cisco交换机日志信息操作指引...
  2. java 阳历日期时间获取年月日时干支
  3. GBASE 8s UDR内存管理_02_mi_dalloc
  4. 5G核心网中的数据管理
  5. android 私密空间,安卓手机怎么开启隐私空间功能
  6. window10添加局域网计算机,win10系统加入局域网连接的设置方案
  7. uc浏览器hd for android pad,UC浏览器hd
  8. 什么是微信分销商城?
  9. php word替换换行符,word换行替换
  10. mac android usb共享网络,mac 网络共享软件 手机usb共享网络方法和技巧详解介绍