首页 > 其他分享 >最大子序和

最大子序和

时间:2022-09-20 17:57:48浏览次数:76  
标签:ll 最大 int res tt leq hh 子序

斜率优化DP

原题链接

题目描述:求长度为n的序列中一段长度不超过m的连续子序列的最大和

一段区间的和可以用前缀和来搞定
状态定义:
f[i]表示以a[i]结尾的长度不超过m的连续子序列最大和
状态转移:

\[f_i=max\{s_i-s_j\}\quad(1\leq i-j\leq m) \]

得到\(j\)的范围:\(i-m\leq j\leq i-1\)
可以得到:\(f_i=s_i-min\{s_j\}\)
也就是求一个窗口内\(s_j\)的最小值,自然想到滑动窗口
具体代码如下:

Code

#include <iostream>
#include <algorithm>

using ll = long long;

const int N = 3e5 + 5;

ll s[N], q[N];

int main() {
    int n, m;
    std::cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) {
        std::cin >> s[i];
        s[i] += s[i - 1];
    }
    
    ll res = -1e18, hh = 0, tt = -1;
    q[ ++ tt] = 0; // 先将下标0放入队列,因为前缀和
    for (int i = 1; i <= n; i ++ ) {
        if (i - m > q[hh]) hh ++ ;
        res = std::max(res, s[i] - s[q[hh]]);
        while (hh <= tt && s[q[tt]] >= s[i]) tt -- ;
        q[ ++ tt] = i;
    }
    
    std::cout << res << '\n';
    return 0;
}

标签:ll,最大,int,res,tt,leq,hh,子序
From: https://www.cnblogs.com/zjh-zjh/p/16711939.html

相关文章

  • Problem P19. [算法课贪婪]三角形的最大周长
    贪心:选三个最长的边组成三角形,如果最长的三个边不能组成,那么这时候无论把第二和第三大的边换成什么都不可能能够和最大的边组成三角形,这时候就必须把最大的边给换掉,把最......
  • MySQL查看最大连接数和修改最大连接数
    1、查看最大连接数showvariableslike'%max_connections%';2、修改最大连接数setGLOBALmax_connections=200;以下的文章主要是向大家介绍的是MySQL最大连接数的......
  • 01-最大子列和问题
    最大子列和问题概述本文主要讲解最大子列和问题的求解什么是最大子列和问题?有一个整数数组{A1,A2,A3,...,An}求函数f(i,j)=max(0,∑Ak),k∈[i,j]的值简单来说,求一......
  • 子序列的和(subsequence)
    【题目描述】输入两个正整数n和m,(n<m<106),输出1/n2+1/(n+1)2+...+1/m2,保留5位小数。输出包含多组数据,结束标记为n=m=0。提示:本题有陷阱。【样例输入】24 ......
  • Problem P18. [算法课贪婪]6和9组成的最大数字
    贪心:把9换成6是不可能的,只有把6换成9,而且要换就换最高位的那个6C++:to_string可以将整数转化为string类型,stoi可以将string转化为int类型,这个好用!#i......
  • 分组后A列最大的B列
    分组后A列最大的B列,分组:employee_id A列:log_date  B列:old_salary  select*from"plch_emp_log"orderBY"employee_id","log_date";select"employee_id",......
  • 2022ICPC网络赛 L LCS-like Problem(DP 子序列自动机)
    LLCS-likeProblem(DP子序列自动机)题目:​ 给出两个串s,t。请找出一个最长的子序列\(s'\),使其与\(t\)的最长公共子序列长度不大于1。输出这个最长的长度。思路:​ 题目......
  • jz42连续字数的最大和(动态规划,贪心)
    publicclasssolution{ publicintmaxOfSubarray(int[]array){   int[]dp=newint[array.length];   dp[0]=array[0];   intmax=array[0]; ......
  • 高亮显示最大和最小值
     问题:高亮显示最大值(红色)和最小值(绿色)条件格式解决。选取B1:B12》开始》条件格式》项目选取规则前10项》1》确定最后10项》1》绿填充色深绿色文本》确定 ......
  • JAVA 遍历数组,找出数组中的最大值
    publicclasstest1{publicstaticvoidmain(String[]args){int[]arr={99,25,34,48,63,78,101,71,12};intmax=arr[0];for(inti=......