• 51nod1049 最大子段和【动态规划】


    N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值。当所给的整数均为负数时和为0。

    例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。

     收起

    输入

    第1行:整数序列的长度N(2 <= N <= 50000)
    第2 - N + 1行:N个整数(-10^9 <= A[i] <= 10^9)

    输出

    输出最大子段和。

    输入样例

    6
    -2
    11
    -4
    13
    -5
    -2

    输出样例

    20

     思路:因为最大 连续子序列和只可能是以位置0~n-1中某个位置结尾。当遍历到第i个元素时,判断在它前面的连续子序列和是否大于0,如果大于0,则以位置i结尾的最大连续子序列和为元素i和前门的连续子序列和相加;否则,则以位置i结尾的最大连续子序列和为元素i。

    #include<cstdio>
    #include<queue>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    const int maxn=200005;
    int a[maxn];
    ll maxsequence3(int a[], int len)
    {
        ll maxsum, maxhere;
        maxsum = maxhere = a[0];   //初始化最大和为a【0】
        for (int i=1; i<len; i++) {
            if (maxhere <= 0)
                maxhere = a[i];  //如果前面位置最大连续子序列和小于等于0,则以当前位置i结尾的最大连续子序列和为a[i]
            else
                maxhere += a[i]; //如果前面位置最大连续子序列和大于0,则以当前位置i结尾的最大连续子序列和为它们两者之和
            if (maxhere > maxsum) {
                maxsum = maxhere;  //更新最大连续子序列和
            }
        }
        return maxsum;
    }
    
    
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;++i)
            scanf("%d",&a[i]);
        printf("%lld
    ",maxsequence3(a,n));
        return 0;
    }
    
  • 相关阅读:
    poj1363Rails(栈模拟)
    centos6.5设备mysql5.6
    SGU326Perspective(网络流量的最大流量)(经典赛车模型)
    扩大或缩小undo表空间
    Boost源代码学习---shared_ptr.hpp
    leetcode
    为客户打造RAC-DG一些遇到的问题汇总
    十归并排序有用的算法和二进制搜索的基础
    Delphi TNativeXML Node节点乱码的一种解决方法
    Delphi TcxTreeList 读取 TcxImageComboBoxItem类型的值
  • 原文地址:https://www.cnblogs.com/aerer/p/9930915.html
Copyright © 2020-2023  润新知