zoukankan      html  css  js  c++  java
  • 51nod 1050 循环数组最大子段和【动态规划】

    N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。

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

     收起

    输入

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

    输出

    输出循环数组的最大子段和。

    输入样例

    6
    -2
    11
    -4
    13
    -5
    -2

    输出样例

    20

    1)正常数组中间的某一段和最大。这个可以通过普通的最大子段和问题求出。

        (2)此数组首尾相接的某一段和最大。这种情况是由于数组中间某段和为负值,且绝对值很大导致的,那么我们只需要把中间的和为负值且绝对值最大的这一段序列求出,用总的和减去它就行了。

         即,先对原数组求最大子段和,得到ans1,然后把数组中所有元素符号取反,再求最大子段和,得到ans2,

         原数组的所有元素和为ans,那么最终答案就是max(ans1, ans + ans2)。

    讲真的~我不会,这是看网上巨佬的思路,等我理解了再来补啊

    #include<cstdio>
    #include<queue>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    const int maxn=50005;
    int a[maxn];
    ll maxsequence(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;
        ll sum=0;
        scanf("%d",&n);
        for(int i=0;i<n;++i)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        ll ans1=maxsequence(a,n);
        for(int i=0;i<n;++i)
            a[i]=-a[i];
        ll ans2=maxsequence(a,n);
        ll ans=max(ans1,sum+ans2);
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    发送短信/邮件/打电话 code(转)
    如何学习算法
    堆和栈的区别
    2010 baidu笔试
    关于TableView中图片的延时加载(转)
    sqlite + UITableView 实现iPhone大数据浏览
    2010 Google中国笔试试题
    海量数据处理方法总结(转)
    IPhone WebApp 设计开发工具与资源(转)
    DynamicDataSet
  • 原文地址:https://www.cnblogs.com/aerer/p/9930911.html
Copyright © 2011-2022 走看看