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

  • 相关阅读:
    机器学习初篇(0.0)
    MQTT 入门介绍
    《八极拳谱》(李书文)
    Golang实战群:日志的处理机制
    【转】火山引擎 Redis 云原生实践
    【转】7000字前端性能优化总结 | 干货建议收藏
    微信小程序canvas绘制圆角边框
    【转】语义化版本 2.0.0
    Verdaccio私有 npm 服务器搭建及其配置
    【转】根据条件配置多个npm仓库
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3438985.html
Copyright © 2011-2022 走看看