最大子列和問題

2021-10-02 04:40:04 字數 2382 閱讀 6575

浙江大學資料結構慕課學習

給定k個整數組成的序列,「連續子列」被定義為,其中 1≤i≤j≤k。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。

本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下:

資料1:與樣例等價,測試基本正確性;

資料2:102個隨機整數;

資料3:103個隨機整數;

資料4:104個隨機整數;

資料5:105個隨機整數;

輸入格式:

輸入第1行給出正整數k (≤100000);第2行給出k個整數,其間以空格分隔。

輸出格式:

在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。

輸入樣例:

6-2 11 -4 13 -5 -2

輸出樣例:

20法一:

時間複雜度:o(n2)

把數列裡面所有的子列和均求出來,預先設定乙個最大值max為0(因為若都是負數,則輸出為0),之後每次的子列和若大於max,則將max更新成sum的值。

求所有的子列和採用從最開始資料開始遍歷這個數列,逐漸加後面一項,比較子列和與max的大小,若大於,則更新max;之後從第二項資料開始累加,若大於,更新max;一直到最後乙個資料。

#include

using

namespace std;

intmain()

for(

int i =

0;i}

cout<}

法二:

分治法,時間複雜度:o(nlogn)

不嚴謹地說,發現分治法函式要寫兩次返回,一次是遞迴返回,一次是正常終止條件的返回。

思路:將數列一分為二,先求出左邊數列的最大和,再求出右邊數列的最大和,之後求出跨越邊界的最大和,這三個最大和去比較,得出最大的一項即是最大子列和。

求跨越邊界的最大和:從mid開始向左掃瞄加和,像法一那樣先設立乙個最大值,若leftsum大於最大值,則更新最大值;一直加和到第0項為止;從(mid+1)項開始向右掃瞄加和,方法同「向左掃瞄加和」。最後 midmax 即為lm+rm。

分治法函式遞迴終止條件:left = right時,即數列只有乙個數時,若是正數返回它本身,若是負數返回0。

#include

using

namespace std;

intdivideandconquer

(int array,

int left,

int right)

;int

main()

max =

divideandconquer

(array,

0,k-1)

; cout<}int

divideandconquer

(int array,

int left,

int right)

int mid =

(left+right)/2

;int leftmax =

divideandconquer

(array,left,mid)

;int rightmax =

divideandconquer

(array,mid+

1,right)

;int midmax,lm =

0,rm =0;

int leftsum =0;

int rightsum =0;

for(

int i = mid;i>=left;i--)}

for(

int i = mid+

1;i<=right;i++)}

midmax = lm+rm;

return midmax>leftmax?midmax>rightmax?midmax:rightmax:leftmax>rightmax?leftmax:rightmax;

}

法三:

思想:從頭開始遍歷數列,若當前子列和為負,則令thissum歸0,繼續向後遍歷。因為若當前子列和為負,則往後加乙個數不可能使後面的部分和增大,所以拋棄這一子列。

#include

using

namespace std;

intmain()

int thissum =0;

for(

int i =

0;i(thissum<0)

} cout<}

最大子列和問題

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

最大子列和問題

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

最大子列和問題

給出乙個序列,求出最大子列和。演算法一 long maxsum int a,int n return maxsum 這是乙個窮舉的演算法,有三個巢狀的for迴圈,時間複雜度為o n 3 在計算的時候有很多不必要的重複項,例如當i 0,j 3時,和的計算為 a 1 a 2 a 3 當i 0,j 4時,...