题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050

这个呢,这个题之前 求一遍最大值  然后求一遍最小值

最后结果 res = max( MAX,  SUM - MIN );

但是 这种题如果 要求 变成 最长长度为len的最大子段和,这种思路就会受限制

换一种想法, 让你求最大长度为len的最大字段和 那么 你可以维护一个前缀和

然后结果就是 max( sum[i] - min(sum[j]) , i-len <= j <= i-1 && 1<=i <= 2*n)

然后这么看来 是n^2的dp,那么如何优化呢。

可以预处理  长度为len的区间的最小值  然后对于每个i 查询前面区间长度为 len 的最小值 然后 sum[i] - sum[j]即可 ,(类似RMQ,或者线段树,树状数组都可以做 )复杂度 O(nlogn)

也可以 维护单调队列  单调队列要保证 两点:

1.  队内元素的位置 要符合 i的区间要求 即 i-len <=que[j]<=i-1

2. 单调性, 队列内的元素 尽可能小,维护一个单调非递增队列

#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <algorithm>
using namespace std;
const int N = 5e4+10;
typedef long long ll;int n; ll s[N<<1],sum[N<<1];
int q[N<<1];int main ()
{cin >> n; int len = n;for(int i=1;i<=n;i++) {cin >> s[i];s[i+n] = s[i];}n<<=1;for(int i=1;i<=n;i++) {sum[i] = sum[i-1] + s[i];}ll res = 0;int st=0,ed=0;for(int i=1; i<=n; i++) {if(i <= len)res = max(res, sum[i]); // sum[i] - min(sum[j]),  (i-len<=j<=i-1)while (st < ed && q[st] < i-len) st++; res = max(res, sum[i] - sum[q[st]]);while (st < ed && sum[i] <= sum[q[ed-1]]) ed--;q[ed++] = i;}cout << res <<endl;return 0;
}

转载于:https://www.cnblogs.com/Draymonder/p/9536681.html

51nod 1050 循环数组最大子段和 单调队列优化DP相关推荐

  1. 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  2. 51Nod 1050 循环数组最大子段和

    有两种方式: 1.在首尾之间 2.在尾首之间 对于第一种直接来dp就好,第二种需要将其数组全部取负,然后取到其最大值(肯定是负数的最大值)然后dp即可,最后比较这两个答案谁比较大就输出哪个 1 #in ...

  3. 1050 循环数组最大子段和

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  4. 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)

    题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...

  5. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  6. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

  7. 【单调队列优化DP】烽火传递 LibreOJ - 10180

    题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...

  8. 【单调队列优化 DP】

    LeetCode 41 场双周赛 1687. 从仓库到码头运输箱子 算法:单调队列优化 DP 下文简称最大装货数量 maxBoxesmaxBoxesmaxBoxes 为 mxcmxcmxc,简称最大载 ...

  9. poj 2373(单调队列优化dp)

    在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...

  10. poj 1821(单调队列优化dp)

    题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...

最新文章

  1. scala集合转java_Java,Scala,Guava和Trove集合-它们可以容纳多少数据?
  2. Python笔记-方差分析之单因素方差分析
  3. 开通qq邮箱的smtp服务的流程详情
  4. 特征工程系列学习(一)简单数字的奇淫技巧(下)
  5. Android 通过URL scheme 实现点击浏览器中的URL链接,启动特定的App,并调转页面传递参数...
  6. 【kafka】kafka 2.3 关于控制Broker端入站连接数的讨论
  7. Boring Game (10 分)
  8. 【转】如何读一篇论文
  9. android内存泄漏MAT,利用Android Studio、MAT对Android进行内存泄漏检测
  10. 自然语言处理(NLP)与自然语言理解(NLU)的区别
  11. 图形变换之旋转变换公式推导
  12. 国内做三维GIS的公司总结-cesium和threejs
  13. 信息 按顺序打印commit_风火快递单打印软件按导入数据顺序批量打印,但打出来的顺序和导入的表格里的?...
  14. 【小家Spring】Spring AOP原理使用的基础类打点(AopInfrastructureBean、ProxyProcessorSupport、Advised、AjType)
  15. 微软在2022年Gartner云计算AI开发者服务魔力象限中被评为“领导者”
  16. 【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown 最佳买卖股票时机含冷冻期(Medium)(JAVA)
  17. 【i.MX6ULL】驱动开发3——GPIO寄存器配置原理
  18. 能源实现物联网云平台方案
  19. Cimplicity 国内知名汽车厂设备监控PMC系统
  20. Windows下测试tcp/udp端口是否打开

热门文章

  1. cobbler报错:No such command: --get-loaders解决方案
  2. 关于C# winform开发时datagridview图片显示异常的处理
  3. 动态路由之RIP协议、Bellman-Ford算法
  4. PTA(BasicLevel)-1009 说反话
  5. 想要组装一台 RISC-V PC?试试这个 RISC-V 开发板
  6. tomcat安全加固配置手册
  7. http请求中乱码------编码的转换
  8. xinetd出马拯救Ftp服务器
  9. Windows7磁盘检查与整理的使用
  10. rz/sz安装与乱码问题