题目链接:点击这里
题意:给定一个 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;
}
微信公众号《算法竞赛求职》,致力于详细讲解竞赛和求职所涉及到的算法原理和模板。欢迎关注,一起交流进步!