最大子序列和

来源:互联网 发布:西安爱知 地址 编辑:程序博客网 时间:2024/05/18 18:02

一、暴力求解

时间复杂度为n^2

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <cmath>using namespace std;#define inf 0x3f3f3f3fint main(){    int a[10002],maxx,sum,n;    scanf("%d",&n);    for(int i=0;i<n;++i)        scanf("%d",&a[i]);    maxx = -inf    for(int i=0;i<n;++i)    {        sum = 0;        for(int j=i;j<n;++j)        {            sum += a[j];            maxx=max(sum,maxx)        }    }    printf("%d\n",maxx);}

优化

时间复杂度n
该方法优化的基于的思想就是,最大连续子序列的开始一段的序列肯定不会是负数。
比如i……j……n是最大连续子序列的话,那么i+….+j肯定大于0,否则,我们就可以把这一段序列去掉换来更大的和。

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <cmath>using namespace std;#define inf 0x3f3f3f3fint main(){    int a[10002],maxx,n,sum;    scanf("%d",&n);    for(int i=0;i<n;++i)        scanf("%d",&a[i]);    sum = 0;    maxx = -inf;    for(int i=0;i<n;++i)    {        if(sum<=0)//如果前面的和为负,则前面的序列舍掉从本元素开始重新确定新序列            sum = a[i];        else//如果前面的和为正,则可能出现在最大序列中,所以要继续累加            sum += a[i];        maxx=max(maxx,sum)    }    printf("%d\n",maxx);    return 0;}
原创粉丝点击