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;
}
相关文章
Leetcode 53.Maximum Subarray
题意简单,给出一个数组,求出其中最大的子数组和。 这种简单题目背后蕴藏着很巧妙的解题方法。其实只需要遍历一次数组就可以求得解。 思路是这样的,你想想看,如果一段子数组的和是负数, 那么这一段子数组不可能是最大和数组的一部分,丢掉重新从下一个位置开始选。
46 0
|
人工智能 算法
1305:Maximum sum
1305:Maximum sum
LeetCode 209. Minimum Size Subarray Sum
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
115 0
LeetCode 209. Minimum Size Subarray Sum
LeetCode 53. Maximum Subarray
给定整数数组nums,找到具有最大总和的子数组(数组要求连续)并且返回数组的和,给定的数组包含至少一个数字。
43 0
LeetCode之Max Consecutive Ones
LeetCode之Max Consecutive Ones
133 0
1104. Sum of Number Segments (20) consecutive subsequence 每个数出现的次数
Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence.
967 0
|
人工智能 机器学习/深度学习
1007. Maximum Subsequence Sum (25)
简析:求最大子列和,并输出其首末元素。在线处理,关键在于求首末元素。 本题囧,16年9月做出来过,现在15分钟只能拿到22分,有一个测试点过不了。
974 0