最大子串和

来源:互联网 发布:淘宝客微信公众号推广 编辑:程序博客网 时间:2024/05/19 17:57

本文讨论的最大子串和指的是在一个数字序列中,求出所有子串各数字之和最大

对于给定的一个数字序列,这里以{-4,11,-2,13,-7,-3,12}为例说明(代码示例则是普遍对于整型数字序列

先给出代码,不懂的读者再看讲解

#include <iostream>using namespace std;int a[1010];long maxSubStr(int a[],int n){    int m=0,sum=0;    for(int i=0;i<n;i++){        if(m>0){            m+=a[i];        }        else {            m=a[i];        }        if(m>sum){            sum=m;        }    }    return sum;}int main (){    int n;    cin>>n;    for(int i=0;i<n;i++){        cin>>a[i];    }    cout<<"最大子串和:"<<maxSubStr(a,n)<<endl;    return 0;}

分析:

在本程序中运用的是动态规划的思想,时间复杂度为O(n),空间复杂度为O(1),

核心思想:

利用中间变量m来更新我们的sum的最大值,

当m<=0时,表明在此下标以前的数字序列的和为负,那么不管我们后边的序列是何值,在加上m后必定不会增加,那么此时我们应该舍弃m,将m更新为下一个值

当m>0,后边序列加上m都会使其增加,则我们更新m的值为此时的m加上下一个值

最关键的是后边的m和sum的比较,此步骤实现了动态规划的思想,当我们检测到m的值比此刻的sum更大时,表明出现了新的最大子串和,更新sum

如果我们需输出最大子串和的每一个组成元素的话,我们就需要引进两个下标变量来记录子串的起始和终止位置

更多内容请关注个人MyBlog

原创粉丝点击