21. 最大序列和

作者: IceFrozen | 来源:发表于2019-01-14 18:59 被阅读0次
题目描述

给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。 对于S的所有非空连续子序列T,求最大的序列和。 变量条件:N为正整数,N≤1000000,结果序列和在范围(-263,263-1)以内。

输入描述:

第一行为一个正整数N,第二行为N个整数,表示序列中的数。

输出描述:

输入可能包括多组数据,对于每一组输入数据,
仅输出一个数,表示最大序列和。

示例1

输入

5
1 5 -3 2 4

6
1 -2 3 4 -10 6

4
-3 -1 -2 -5

输出

9
7
-1
解法一
#include <stdio.h>
#include <limits.h>

#define max(a, b) ((a) > (b) ? (a) : (b))

int main() {
    for (int N; ~scanf("%d", &N);) {
        int sum = 0;
        int res = INT_MIN;    //int 最小值
        for (int x, i = 0; i < N; i++) {
            scanf("%d", &x);
            sum = max(sum + x, x);    //一开始就求序列和的最大值,如果前面序列和小于当前输入值,则放弃序列和,这样一路走下来总是最优的
            res = max(res, sum);    //保留最大的序列和
        }
        printf("%d", res);
    }
    return 0;
}
思路二:动态规划

本质上和上述方法一样,但是理解起来倾向于动态规划的思想,更直观。
记 dp[i] 为以第 i 个数结尾的最大序列和,则 dp[i] = max{dp[i - 1] + num[i], num[i]},其中 num[i] 表示第 i 个数

解法二
#include <stdio.h>
#include <malloc.h>

#define max(a, b) ((a) > (b) ? (a) : (b))

int main() {
    for(int N; ~scanf("%d", &N);) {
        int res = 0;    //输出的结果
        int *dp = (int *) malloc (sizeof(int) * N);    //dp 数组
        int *num = (int *) malloc (sizeof(int) * N);    //输入的数组
        for (int i = 0; i < N; i++)
            scanf("%d", &num[i]);
        res = dp[0] = num[0];
        for (int i = 1; i < N; i++)
            dp[i] = max(dp[i - 1] + num[i], num[i]);
        for (int i = 1; i < N; i++)
            res = max(res, dp[i]);
        printf("%d", res);
        free(dp);
        free(num);
    }
    return 0;
}

相关文章

  • 21. 最大序列和

    题目描述 给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。 对于S的所...

  • 算法导论:最大子序列和

    算法导论:最大子序列和 问题描述:什么是最大子序列和呢?就是给定一组序列,所有子序列中和最大的那一组序列。比如这里...

  • 1007 Maximum Subsequence Sum (25

    简单动态规划。以为尾的序列的最大序列和迭代更新的同时顺便用一个数组记录那些构成最大序列和的序列的左端点。

  • 最大子序列和

    不知道会不会有问题

  • 最大子序列和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 解...

  • 最大子序列和

  • 最大子序列和

    https://leetcode-cn.com/explore/interview/card/bytedance/...

  • 求最大序列和

    有两种解法,首先看我的错误解法#include int main() { int n; while(sca...

  • (315)最大子序列和(4种方式)

    一、问题描述 输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例...

  • 最大子序列和问题(C语言)

    最大子序列和(maxSubSeqSum) 时间复杂度:T(N)=O(N3) 最大子序列和改进1(maxSubSeq...

网友评论

    本文标题:21. 最大序列和

    本文链接:https://www.haomeiwen.com/subject/yubjdqtx.html