C 解決最大子列和問題,演算法時間複雜度優化

2021-07-27 00:02:34 字數 1596 閱讀 1016

問題描述很簡單,對於給定的整數a1,a2,.......an(可能有負數),求ak+a2+........+aj的最大值(k=串數的和最大非空連續子陣列。(為了方便起見,如果所有的整數均為負數,則最大的子串行和為0)。

演算法1:窮舉演算法:

//計算並返回所最大子串行的和:窮舉遍歷

int maxsubsum1(const vector& a)

//儲存兩者的最大值

if(thissum > maxsum)

maxsum = thissum;

} }return maxsum;

}

這種演算法的時間複雜度為o(n

3).(立方)

演算法2:窮舉優化,可以省去第三重迴圈,演算法複雜度為o(n2)。(平方)

//計算並返回所最大子串行的和:窮舉優化

int maxsubsum2(const vector& a)

} return maxsum;

}

演算法3:分而治之

分而治之,顧名思義分為兩個部分

在最大子串行和的問題裡,最大子串行的和可能出現在三個地方:

對於前兩種可以遞迴求解,對於第三種,可以把左右兩個部分的和分別求出,然後加在一起。

演算法複雜度為o(nlogn)。

/計算並返回所最大子串行的和:分而治之

int maxsubsum3(const vector& a,int left,int right)

//獲取中點

int center = (left + right) / 2;

/* 整個出現在輸入資料的左半部的最大子串行求和 */

int leftmaxsum = maxsubsum3(a,left,center);

/* 整個出現在輸入資料的右半部的最大子串行求和 */

int rightmaxsum = maxsubsum3(a,center+1,right);

//計算左右兩個子串行求和結果的最大值

int lrmaxsum = max(leftmaxsum,rightmaxsum);

/* 橫跨左右兩個部分的最大子串行求和 */

//從center向左處理左半邊

int maxleftsum = 0;

int leftsum = 0;

for (int i = center; i >= left; i--)

//從center向右處理右半邊

int maxrightsum = 0;

int rightsum = 0;

for (int j = center+1; j <= right; j++)

//返回求和和前面算出結果的最大值

return max( lrmaxsum, maxleftsum+maxrightsum);

}

演算法4,:及時處理

//計算並返回所最大子串行的和:最優演算法

int maxsubsum4(const vector& a)

return maxsum;

}

演算法 最大子列和問題

浙江大學 資料結構 思考題 每週練習答案彙總 題目 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況...

最大子列和問題(C語言 分治演算法)

最大子列和問題 maximum subsequence sum 給定k個整數組成的序列,連續子列 被定義為 ni 1 n jn j nj 其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和11。現要求你編寫程式,計算給定整數序列的最大子列和。...

最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...