Description

给定有n个整数(可能为负整数)组成的序列a1,a2,...,an,求该序列连续的子段和的最大值。 如果该子段的所有元素和是负整数时定义其最大子段和为0。

Input

第一行有一个正整数n(n<1000),后面跟n个整数,绝对值都小于10000。直到文件结束。

Output

输出它的最大子段和。

Sample Input

6 -2 11 -4 13 -5 -2

Sample Output

20

参考: https://blog.csdn.net/niteip/article/details/7444973#

  1. 穷举法 时间复杂度:$O(n^3)$

    /*O(n^3)*/
    #include <stdio.h>
    #include <stdlib.h> int main()
    {
    int n;
    int num[1001];
    int i, j, k;
    int sum, max;
    while (~scanf("%d", &n))
    {
    for (i = 0; i < n; i++)
    scanf("%d", &num[i]);
    max = 0;
    for (i = 0; i < n; i++)
    {
    for (j = i; j < n; j++)
    {
    sum = 0;
    for (k = i; k <= j; k++)
    sum += num[k];
    if (sum > max)
    max = sum;
    }
    }
    printf("%d\n", max);
    }
    return 0;
    }
  2. 穷举法

    时间复杂度:$O(n^2)$

    /*O(n^2)*/
    #include <stdio.h>
    #include <stdlib.h> int main()
    {
    int n;
    int num[1001];
    int i, j, k;
    int sum, max;
    while (~scanf("%d", &n))
    {
    for (i = 0; i < n; i++)
    scanf("%d", &num[i]);
    max = 0;
    for (i = 0; i < n; i++)
    {
    sum = 0;
    for (j = i; j < n; j++)
    {
    sum += num[j];
    if (sum > max)
    max = sum;
    }
    }
    printf("%d\n", max);
    }
    return 0;
    }
  3. 分治法

    时间复杂度:$O(nlog_2n)$

    /*O(nlogn)分治法*/
    #include <iostream>
    #include <cstdio>
    #include <cstdlib> int maxSubSegSum(int num[], int left, int right)
    {
    int mid = (left + right) / 2; if (left == right)
    return num[left] > 0 ? num[left] : 0; int leftMaxSum = maxSubSegSum(num, left, mid);
    int rightMaxSum = maxSubSegSum(num, mid + 1, right); int sum = 0;
    int leftSum = 0;
    for (int i = mid; i >= left; i--)
    {
    sum += num[i];
    if (sum > leftSum)
    leftSum = sum;
    } sum = 0;
    int rightSum = 0;
    for (int i = mid + 1; i <= right; i++)
    {
    sum += num[i];
    if (sum > rightSum)
    rightSum = sum;
    } int retSum = leftSum + rightSum;
    if (retSum < leftMaxSum)
    retSum = leftMaxSum;
    if (retSum < rightMaxSum)
    retSum = rightMaxSum;
    return retSum;
    } int main()
    {
    int n;
    int num[1001]; while (~scanf("%d", &n))
    {
    for (int i = 0; i < n; i++)
    scanf("%d", &num[i]);
    printf("%d\n", maxSubSegSum(num, 0, n - 1));
    }
    return 0;
    }
  4. 动态规划

    时间复杂度:$O(n)$

    /*O(n) 动态规划*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <memory.h> int main()
    {
    int n;
    int num[1001];
    int f[1001 + 1];
    int i;
    int max;
    while (~scanf("%d", &n))
    {
    for (i = 1; i <= n; i++)
    scanf("%d", &num[i]);
    max = 0;
    memset(f, 0, sizeof(f));
    for (i = 1; i <= n; i++)
    {
    if (f[i - 1] > 0)
    f[i] = f[i - 1] + num[i];
    else
    f[i] = num[i];
    if (f[i] > max)
    max = f[i];
    }
    printf("%d\n", max);
    }
    return 0;
    }

    或者

    /*O(n) 动态规划*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <memory.h> int main()
    {
    int n;
    int num[1001];
    int b;
    int i;
    int max;
    while (~scanf("%d", &n))
    {
    for (i = 1; i <= n; i++)
    scanf("%d", &num[i]);
    max = 0;
    b = 0;
    for (i = 1; i <= n; i++)
    {
    b = b > 0 ? b + num[i] : num[i];
    max = b > max ? b : max;
    }
    printf("%d\n", max);
    }
    return 0;
    }

最大子段和问题(C/C++)的更多相关文章

  1. 最大子段和(c++)

    // 最大子段和.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namesp ...

  2. 51Node 1065----最小正子段和

    51Node  1065----最小正子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],从中选出一个子序列(a[i],a[i+1],…a[j]),使这个子序列的和>0,并且这 ...

  3. 最大M子段和 V2

    51nod1053 这题还是我们熟悉的M子段和,只不过N,M<=50000. 这题似乎是一个堆+链表的题目啊 开始考虑把所有正数负数锁在一起. 比如: 1 2 3 -1 –2 -3 666 缩成 ...

  4. 51nod 循环数组最大子段和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 对于普通的数组,只要求一次最大子段和即可.但是这题是可以循环的,所 ...

  5. [日常训练]最大M子段和

    Description 在长度为的序列中选出段互不相交的子段,求最大字段和. Input 第一行两个整数. 第二行个整数. Output 一行一个整数表示最大值. Sample Input 5 2 1 ...

  6. 51nod1049(计算最大子段和)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1049 题意:又是仲文题诶- 思路:暴力会超时,又好像没什么专门 ...

  7. XCOJ 1103 (LCA+树链最大子段和)

    题目链接: http://xcacm.hfut.edu.cn/problem.php?id=1103 题目大意:链更新.链查询,求树链的最大子段和.(子段可以为空) 解题思路: 将所有Query离线存 ...

  8. 洛谷P1121 环状最大两段子段和

    题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...

  9. [51NOD1959]循环数组最大子段和(dp,思路)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 这道题的最大子段和有两种可能,一种是常规的子段和,另一种 ...

  10. 转载:最大子段和问题(Maximum Interval Sum)

    一.问题描述         给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+…+a[j]和最大.或者求出最大的这个和.       例如(-2,11,- ...

随机推荐

  1. intellij idea:设置java方法注释模板(intellij idea 2019.2)

    一,打开方法注释模板的编辑窗口 菜单file->打开settings editor栏目下->打开Live Templates   说明:刘宏缔的架构森林是一个专注架构的博客,地址:http ...

  2. ansible使用playbook的简单例子(ansible2.9.7)

    一,ansible使用playbook的优点 1,用ansible执行一些简单的任务,使用ad-hoc命令就可以解决问题 如果执行复杂的功能,需要大量的操作,执行的ad-hoc命令会不够方便,这时我们 ...

  3. 蓝桥杯 Island Hopping Java代码

          问题描述 太平洋岛网公司(PLN)已经瞄向了太平洋中的一些群岛.这些群岛没有快捷的互联网连接.PLN计划向群岛提供互联网服务,以开发这个太平洋中潜在的市场.每组群岛的核心岛屿已经被深海电缆 ...

  4. Spring Cloud Alibaba Sentinel

    一.介绍(sentinel 1.7.0) 1,官网地址 https://github.com/alibaba/Sentinel 中文地址:https://github.com/alibaba/Sent ...

  5. 10 个 Python 初学者必知编码小技巧

    技巧 #1 字符串翻转 a = "codementor">>> print "Reverse is",a[::-1]翻转后的结果为 rotne ...

  6. 19. [链表][双指针]删除链表的倒数第N个节点

    19. 删除链表的倒数第N个节点 方法一:哨兵节点+快慢指针 在本题中,快慢指针的用法为:让快指针先走几步,步数由 \(n\) 决定. 使用哨兵节点的理由是为了避免删除节点为头结点引发的空指针异常. ...

  7. 通过两行代码即可调整苹果电脑 Launchpad 图标大小

    之前用 13 寸 Mac 的时候我还没觉得,后来换了 16 寸就发现有点不对劲了.因为 Mac 的高分辨率,当你进入 Launchpad 界面,应用图标的大小可能会让你怀疑:这特么是苹果的设计吗?有点 ...

  8. AWS Lambda 借助 Serverless Framework,迅速起飞

    前言 微服务架构有别于传统的单体式应用方案,我们可将单体应用拆分成多个核心功能.每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作时不会互相影响 这种设计理念被进一步应用,就变成了无 ...

  9. 关于eslint的使用与配置,以及prettier的使用

    eslint官网:https://eslint.bootcss.com/docs/user-guide/getting-started eslint配置:http://eslint.cn/docs/r ...

  10. 【DeepLearning】AlexNet

    在前文中,我们介绍了LeNet的相关细节,它是由两个卷积层.两个池化层以及两个全链接层组成.卷积都是5*5的模板,stride =1,池化为MAX.整体来说它有三大特点:局部感受野,权值共享和池化.2 ...