#P1395. [算法竞赛进阶指南]最大子序和

[算法竞赛进阶指南]最大子序和

Description

输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。## Input Format

第一行两个数n,m(n,m<=300000) 第二行有n个数,要求在m个数内找到最大子序和

Output Format

一个数,数出他们的最大子序和

6 4
1 -3 5 1 -2 3​
7​

Hint

前缀和最大的优点就是求连续区间的值: a[10]={0,1,2,3,4,5,6,7,8,9};

b[10]={0,1,3,6,10,15,21,28,36,45}; 我们可以发现b[5]-b[2]=15-3=12=a[3]+a[4]+a[5] 这样我们就可以利用前缀和来解决这个问题

#include <iostream>
using namespace std;
#define ll long long
const int maxn = 300050;
int n, m;
int a[maxn], b[maxn];
ll sum = -0x3f3f3f;
int main() {
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        a[i] = a[i - 1] + a[i];
    }
    for (int i = 0; i <= n; i++) {
        for (int j = i + 1; j <= i + m; j++)
            if (a[j] - a[i] > sum)
                sum = a[j] - a[i];
    }
    cout << sum;
    return 0;
}

Source

单调队列 前缀和