51nod 1050 循环数组最大子段和 单调队列优化DP
题目链接: 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+;
typedef long long ll; int n; ll s[N<<],sum[N<<];
int q[N<<]; int main ()
{
cin >> n; int len = n;
for(int i=;i<=n;i++) {
cin >> s[i];
s[i+n] = s[i];
}
n<<=;
for(int i=;i<=n;i++) {
sum[i] = sum[i-] + s[i];
}
ll res = ;
int st=,ed=; for(int i=; 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-]])
ed--;
q[ed++] = i;
}
cout << res <<endl;
return ;
}
51nod 1050 循环数组最大子段和 单调队列优化DP的更多相关文章
- 51nod 1050 循环数组最大子段和
题目链接:51nod 1050 循环数组最大子段和 #include<stdio.h> #include<algorithm> using namespace std; ; l ...
- 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该 ...
- 51Nod 1050 循环数组最大子段和 | DP
Input示例 6 -2 11 -4 13 -5 -2 Output示例 20 分析: 有两种可能,第一种为正常从[1 - n]序列中的最大子字段和:第二种为数组的total_sum - ([1-n] ...
- 51nod 1050 循环数组最大子段和【动态规划】
N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n] ...
- 51nod 1050 循环数组最大子段和 (dp)
http://www.51nod.com/onlineJudge/questionCode.html#problemId=1050¬iceId=13385 参考:http://blog. ...
- 1042 数字0-9的数量 1050 循环数组最大子段和 1062 序列中最大的数 1067 Bash游戏 V2 1092 回文字符串
1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- 【单调队列优化dp】uestc 594 我要长高
http://acm.uestc.edu.cn/#/problem/show/594 [AC] #include<bits/stdc++.h> using namespace std; t ...
- 算法笔记--单调队列优化dp
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...
随机推荐
- LoadRunner中获取当前系统时间方法
LoadRunner中获取当前系统时间方法 发表于:2017-6-02 11:41 作者:人生_0809 来源:51Testing软件测试网采编 字体:大 中 小 | 上一篇 | 下一篇 | 打 ...
- MySQL数据库运维课程
MySQL数据库运维课程 http://www.dataguru.cn/article-4834-1.html?union_site=comm100 课程大纲 第一课:机器选型.系统规划 第二课:安装 ...
- 杀死正在运行的进程: linux
1:杀死正在运行的进程:使用ps -aux|grep labor 查出进程PID 2:使用kill PID 将进程杀死.
- [sql]mysql管理手头手册,多对多sql逻辑
各类dbms排名 cs模型 mysql字符集设置 查看存储引擎,字符集 show variables like '%storage_engine%'; show VARIABLES like '%ma ...
- Andrew Ng-ML-第九&十章-神经网络
1.神经网络模型1 图1 这是一个神经网络的模型,通常设置一个x0,作为偏执单元或者偏置(bias)神经元. 图2 这里最后一句话,说的是系数矩阵θ,神经网络模型中,如果当前在j层有s_j个单元,在j ...
- openstack 部署笔记--nova
控制节点 配置用户与服务 $ . admin-openrc $ openstack user create --domain default --password-prompt nova $ open ...
- centos7最小安装初始化脚本
#!/bin/bash #zhangsen #lovexlzs@qq.com if [[ "$(whoami)" != "root" ]]; then exit ...
- [LeetCode] 690. Employee Importance_Easy tag: BFS
You are given a data structure of employee information, which includes the employee's unique id, his ...
- 2018-2019-2 网络对抗技术 20165324 Exp4:恶意代码分析
2018-2019-2 网络对抗技术 20165324 网络对抗技术 Exp4:恶意代码分析 课下实验: 实践目标 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析E ...
- html05
1.js中的对象-内置对象-外部对象-自定义对象 2.常见的内置对象有哪些?-String对象-Number对象-Boolean对象-Array对象-Math对象-Date对象-RegExp正则对象- ...