最大子列和問題
阿新 • • 發佈:2018-12-23
這是一個挺簡單問題,但是由於最近考試有點頻繁,加上很久以前寫過這個題目,所以就來複習下,感覺以前學的東西都忘的差不多了,有點慌啊。感覺這一段時間需要複習下了。不復習要歇逼了。。。
言歸正傳,求最大子序列問題:有很多種方法,這裡就說一下時間複雜度最簡單的演算法,此演算法只需要遍歷一遍就可以,所以時間複雜度為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; }