浙大数据结构第一周Maximum Subsequence Sum

题目详情:

Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni+1​, ..., Nj​ } 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.

Sample Input:

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

Sample Output:

10 1 4

简单翻译:

对于给定数组,不仅要找到最大子序和,还要找到最大子序和对应的开头与结尾的元素,其中如果数组全是负数就返回0与原数组的开头与结尾元素

主要思路:

这一题不仅要求最大子列和,还要求出子列的第一个元素与最后一个元素,如果给的原数组全是负数,定义它的子列和是0,输出原数组的第一个元素和最后一个元素

设计5个参数:sum,maxSum,start, maxStart,maxEnd

初始化maxSum时尤其有讲究,maxSum究竟初始化0还是-1?应该是-1,因为如果数组里只有0和负数,那最大子列和就是0,第一个元素和最后一个元素也是0

循环时如果sum加当前元素num[i]后小于0,就要重置sum=0,同时重置start=i+1(+1很关键,保证start移到了下一位,不然如果start = i,那start还指在使sum<0的子序列的最后一位),执行过后continue,因为后一个if判断已经没必要做了 

如果sum>maxSum,就将maxSum用sum替换,同时maxStart用start替换,当前的i赋给maxEnd

最后判断如果maxSum < 0,说明原数组全是负数

第一次写错误:

(1)输出的是子列的第一个元素和最后一个元素,不是下标

(2)最难处理的就是数组里只有0和负数这种情况,一开始是将maxSum初始化为0,没有continue,最后判断maxSum是不是==0,但碰到上述情况就会出现应该输出0却输出原数组的第一个元素和最后一个元素

代码实现:

#include <stdio.h>
#define MAX_SIZE 10005
int NUM[MAX_SIZE];
void find(int* num, int len) {
    int sum = 0, maxSum = -1;
    int start = 0, maxStart = 0, maxEnd = 0;
    for(int i = 0; i < len; i++) {
        sum += num[i];
        if(sum < 0) {
            sum = 0;
            start = i + 1;
            continue;
        }
        if(sum > maxSum) {
            maxSum = sum;
            maxStart = start;
            maxEnd = i;
        }
    }
    if(maxSum < 0) {
        printf("0 %d %d", num[0], num[len - 1]);
    }
    else {
        printf("%d %d %d", maxSum, num[maxStart], num[maxEnd]);
    }
    return;
}
int main() {
    int K;
    scanf("%d", &K);
    for(int i = 0; i < K; i++) {
        scanf("%d", &NUM[i]);
    }
    find(NUM, K);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值