输入一个长度为 n的整数序列,从中找出一段长度不超过 m的连续子序列,使得子序列中所有数的和最大。
注意: 子序列的长度至少是 1
输入格式
第一行输入两个整数 n,m
第二行输入 n个数,代表长度为 n 的整数序列。同一行数之间用空格隔开。
输出格式
输出一个整数,代表该序列的最大子序和。
数据范围
1≤n,m≤300000
输入样例:
- 6 4
- 1 -3 5 1 -2 3
输出样例:
7
求连续子序列的和的最大值,可以枚举其左、右端点,
状态表示:f[i]
集合:以第i个元素为右端点的连续子序列的和
属性:max
状态计算:
res=min(res,f[i]-min{s[j})
i-m+1<=j<=i
由状态计算可以看出:
可以用一个单调队列来优化(具体见题目:滑动窗口)
- #include
- #include
- #include
-
- using namespace std;
-
- const int N=300010;
-
- int q[N];
- int s[N];int main()
- {
- int n,m;
- cin>>n>>m;
- for(int i=1;i<=n;i++)
- {
- int x;
- scanf("%d",&x);
- s[i]=s[i-1]+x;
- }
- int res=-0x3f3f3f3f;
- //滑动窗口
- int hh=0,tt=-1;
- q[++tt]=0;
- for(int i=1;i<=n;i++)
- {
- while(hh<=tt&&q[hh]
-
- res=max(res,s[i]-s[q[hh]]);
-
- while(hh<=tt&&s[q[tt]]>=s[i]) tt--;
-
- q[++tt]=i;
- }
-
- cout<
- return 0;
- }
-
相关阅读:
记录一次开机内存分析的全过程
java版Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
使用CPU本地部署一个大模型
C++动态规划算法的应用:得到 K 个半回文串的最少修改次数 原理源码测试用例
Linux系统上安装FTP服务
MFC Windows 程序设计[127]之菜单初体验
求助!什么软件可以人声分离?手机上可以进行人声分离操作吗?
LINUX笔记温习
JavaEE进阶(7)Spring Boot 日志(概述、用途、使用:打印日志,框架介绍,SLF4J 框架介绍、更简单的日志输出)
ConstraintLayout 你真的会用了吗
-
原文地址:https://blog.csdn.net/weixin_62224014/article/details/127623733