Maximum Subsequence Sum

简介: 最大连续子列和问题,在此给出题解 (浙大PTA https://pintia.cn/problem-sets/16/problems/665)

Maximum Subsequence Sum

Given a sequence of K integers {N_1, N_2 , ..., N_K}. A continuous subsequence is defined to be {N_i, N_{i+1}, ... , N_j} where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.
Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.

Input Specification:
Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (≤10000). The second line contains K numbers, separated by a space.

Output Specification:
For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

输入样例:

10
-10 1 2 3 4 -5 -23 3 7 -21

输出样例:

10 1 4

二、题解

c代码

#include <stdio.h>
#define N 10010

int s[N], sum = -1;

int main() {
    int k;
    scanf("%d", &k);
    for (int i = 0; i < k; i++)  scanf("%d", &s[i]);
    
    int cnt = 0, head = 0, rear = 0;
    for (int i = 0, j = 0; i < k; i++) {
        cnt += s[i];
        if(cnt >= 0) {
            if(cnt > sum) {    //临时最大值大于统计的最大值,进行迭代
                sum = cnt;
                head = j;      //最大子列的头坐标与尾坐标也更新
                rear = i;
            }
        } else {        //临时最大值为负,置零重新统计,头坐标临时标记也更新
            cnt = 0;
            j = i + 1;
        }
    }
    
    if(sum >= 0)  printf("%d %d %d\n", sum, s[head], s[rear]);
    else printf("0 %d %d\n", s[0], s[k - 1]);
    
    return 0;
}
相关文章
|
人工智能 算法
1305:Maximum sum
1305:Maximum sum
LeetCode 209. Minimum Size Subarray Sum
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
124 0
LeetCode 209. Minimum Size Subarray Sum
LeetCode之Sum of Two Integers
LeetCode之Sum of Two Integers
124 0
LeetCode之Max Consecutive Ones
LeetCode之Max Consecutive Ones
137 0
1104. Sum of Number Segments (20) consecutive subsequence 每个数出现的次数
Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence.
971 0
|
人工智能 机器学习/深度学习
1007. Maximum Subsequence Sum (25)
简析:求最大子列和,并输出其首末元素。在线处理,关键在于求首末元素。 本题囧,16年9月做出来过,现在15分钟只能拿到22分,有一个测试点过不了。
978 0
[LeetCode] Sum of Two Integers
The code is as follows. public class Solution { public int getSum(int a, int b) { return b == 0 ? a : getSum(a ^ b, (a & b)
1123 0