1. 程式人生 > >最大子列和問題

最大子列和問題

這是一個挺簡單問題,但是由於最近考試有點頻繁,加上很久以前寫過這個題目,所以就來複習下,感覺以前學的東西都忘的差不多了,有點慌啊。感覺這一段時間需要複習下了。不復習要歇逼了。。。

言歸正傳,求最大子序列問題:有很多種方法,這裡就說一下時間複雜度最簡單的演算法,此演算法只需要遍歷一遍就可以,所以時間複雜度為O(n)。

定兩個變數ThisSum和Max,This初始化為0,Max等於陣列中的第一個元素(避免陣列中全為負數的情況),與陣列中的元素相加,在加的過程中

(1)如果ThisSum>Max的話,Max=ThisSum;

(2)如果ThisSum<0,ThisSum=0;

然後輸出Max。

程式碼為:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int k;
int a[100005];
int main()
{
    int Max=0,ThSum=0;
    scanf("%d",&k);
    for (int i=0;i<k;i++)
    {

        scanf("%d",&a[i]);
        if(!i)
        {
            //避免出現所有的數都為負數的情況時,輸出Max值為0的情況
            Max=a[i];
        }
        ThSum+=a[i];
        if(Max<ThSum)
            Max=ThSum;
        if(ThSum<0)
            ThSum=0;
    }
        printf("%d\n",Max);
    return 0;
}