昨天看到乙個演算法題目,題目是這樣子的:
輸入一組整數,求出這組數字子串行和中最大值。也就是只要求出最大子串行的和,不必求出最大的那個序列。例如:
序列:-2 11 -4 13 -5 -2,則最大子串行和為20。
序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,則最大子串行和為16。
這個題目也是在csdn上看到的,個人覺得題目還是說明不夠詳細,比如當序列為:-1 -2 -3 時,則最大子串行和是-1 還是 0 呢?我看題目的樓主也並沒有考慮到,預設序列中一定會出現正整數。從正常角度理解應該是 -1 ,這種情況後面的解法中,我將按照和為 -1 的理解,並且 求出最大子串行。
我的思路是這樣的:假設最大子串行 和為max;
從兩個方面考慮,
第一種情況 是序列中全是負數的特殊情況,這種情況,只要遍歷找到最大的負數,即為最大子串行和,其中的負數也就是最大子串行的;
第二種是 排除第一種情況的一般情況:
假設a[i]+a[i+1]+......+a[i+k]和最大;
則a[i]一定大於等於0,否則max = a[i+1]+......+a[i+k];
同理a[i+k]也應大於0;
由此我們可以從兩頭遍歷,找到首尾第乙個正整數;
若 a[i]+a[i+1]+......+a[i+k]和最大,則a[ i ]+a[i+1] >0否則最大值就是a[ i ]或者a[i+2] +.....a[i+k];
同理a[i]+a[i+1]+a[i+2] >0 否則 最大值就是a[i]+a[i+1]或者a[i+3] +.....a[i+k];
因此,我們可以從第乙個正整數遍歷。
見**
#include#include #include #define max 50
void main(void)
if(input[j]>=0)
break; }
if(max >0 )
if(sum < 0)
}} printf("max = %d \n",max);
printf("max seq = ");
sum = 0;
for(i = low;i system("pause");
return;
}
該演算法很容易理解時間複雜度為o(n).
求最大連續子串行的和
小王的賬本 小王出門打零工,工作很不穩定,收入也很不穩定,他找了乙個賬本記錄他每天的支出,例如 1月1日 收入320 1月2日 沒找到工作,吃飯花了30 1月3日 掙50 1月4日 無工作,吃飯花了17 1月5日 無工作,租房 吃飯花了2600 年底了,小王想知道自己賬本上哪一段時間掙錢掙的最多。剛...
最大連續子串行和 問題
為了證書,重新開始刷資料結構,原本也就是學的一知半解的,上來就給我來了乙個最大子串行和問題,搞得我很無奈,貌似hdu1003就是這個問題.第一 重新定義乙個新的sum陣列,然後進行儲存連續子串行的和,遇到前面的加和sum i 1 小於0,就直接讓sum i a i include include i...
最大連續子串行和問題
第一次看 資料結構與演算法分析 c語言描述 這本書的時候,被書中一上來就給的最大子串行和問題給直接鎮住了。直觀感覺就是好難,好牛逼。問題描述 給定整數k1,k2,k3,kn,求從第i個數到第j個數的最大值。如果所有整數均為負數,那麼最大子串行和規定為0 根據題目描述,最直接的演算法就是窮舉所有的從i...