PAT 1007 Maximum Subsequence Sum (25分)

题目链接:点击这里

题意:给定一个 K K K 个整数的序列,最大子序列是指连续子序列中所有元素的和最大。例如,给定序列 { − 2 , 11 , − 4 , 13 , − 5 , − 2 } \left\{-2, 11, -4, 13, -5, -2\right\} { 2,11,4,13,5,2},其最大子序列为 { 11 , − 4 , 13 } \left\{11, -4, 13\right\} { 11,4,13},最大和为 20 20 20。现在你需要找出最大和,以及最大子序列的第一个和最后一个数。

思路:

关于最大子序列和的详细讲解:点击这里

在上面代码的基础上,如何求出最大子序列的第一个和最后一个数呢?

由于我们寻找到的子序列都是不相交的,所以在变量 s s s 0 0 0 的时候,记录最大子序列的第一个数 s t a r t start start;在更新答案的时候,记录最大子序列的最后一个数 r r r,同时更新 l l l

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 10010;

int a[N];

int main()
{
    
    
    int n, x;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)  scanf("%d", &a[i]);
    
    int ans = -1e9, s = 0;
    int start = 0, l, r;
    for(int i = 0; i < n; i++)
    {
    
    
        if(s < 0)
        {
    
    
            s = 0;
            start = i;
        }
        s += a[i];
        if(s > ans)
        {
    
    
            ans = s;
            l = start, r = i;
        }
    }
    
    if(ans < 0) ans = 0, l = 0, r = n - 1;
    
    printf("%d %d %d", ans, a[l], a[r]);
    
    return 0;
}

微信公众号《算法竞赛求职》,致力于详细讲解竞赛和求职所涉及到的算法原理和模板。欢迎关注,一起交流进步!

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/108983521