zoukankan      html  css  js  c++  java
  • Algorithm4.子数组求和贪心

    子数组求和最大问题 20131011

    问题描述

    一个数组中,有整数也有复数,求这个数组的所有子数组中,求和最大的值。

    这是一个动态规划问题,乍看上去没有什么简单的方法,把所有的情况列出来就可以了,但是时间复杂度太高了,不是一个很好的算法,必须改变方法。

             我们分解问题,就是b[i] 表示以a[i]结尾的子数组最大的和,那么我们可以动态规划,也可以叫做贪心算法。

             对于b[i] = max( b[i-1] + a[i], a[i]);

             因为对于a[i]结尾的子数组,最大的和有两种情况,一个是他自己,一个是把之前的b[i-1]也加上去。如果b[i-1] > 0 则是选择b[i-1]+a[i] ,反之 选择a[i].

    代码:

    int getMaxSubArraySum(const int arr[], int &start, int &end , const int length ){

        int b = 0, maxSum = 0;

        int s =0, e= 0;

       

        for( int  i = 0 ; i < length ; ++i){

            if(b > 0 ){

                b += arr[i];

                e = i;

            }else{

                b = arr[i];

                s = i;

                e = i;

            }

     

            if(maxSum < b){

                start = s;

                end = e;

                maxSum = b;

            }

        }

        return maxSum;

    }

     

    int main()

    {

        int a[] = {1,-2,3,10,-4,7,2,-5};

        int start = 0;

        int end = 0;

        cout << "max sum is " << getMaxSubArraySum(a,start,end,sizeof(a)/sizeof(int)) << endl;

        cout << "start:" << start << endl;

        cout << "end  :" << end << endl;

        return 0;

    }

     

    追梦的飞飞

    于广州中山大学 20131011

    HomePage: http://yangtengfei.duapp.com

  • 相关阅读:
    eclipse中jdk源码调试步骤
    [POJ2777] Count Color
    [HNOI2004] L语言
    [USACO08DEC] 秘密消息Secret Message
    The XOR Largest Pair [Trie]
    前缀统计 [Trie]
    于是他错误的点名开始了 [Trie]
    Palindrome [Manecher]
    兔子与兔子 [Hash]
    [CF985F] Isomorphic Strings
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3438985.html
Copyright © 2011-2022 走看看