最大連續子段和

2022-04-05 03:12:53 字數 2770 閱讀 2147

最大連續子段和

給定長度為n的整數序列,a[1...n], 求[1,n]某個子區間[i,j]使得a[i]+…+a[j]和最大,或者求出最大的這個和。例如(-2,11,-4,13,-5,2)的最大子段和為20,所求子區間為[2,4]。

窮舉法(3次for迴圈)

第1次for迴圈,遍歷陣列所有數字,即確定子段和的首個數字;

第2次for迴圈,遍歷數個數字之後的所有數字,即確定欄位和的最後乙個數字;

第3次for迴圈,遍歷首個數字與最後乙個數字,對之間所有數字求和。

1

int maxsum(int a, int num, int &start, int &end)

9if (thissum >localsum)14}

15}16return

localsum;

17 }

窮舉優化法(2次for迴圈)

第1次for迴圈,遍歷陣列所有數字,即確定子段和的首個數字;

第2次for迴圈,遍歷數個數字之後的所有數字,即確定欄位和的最後乙個數字;

用thissum記錄不同結尾數字對應的子段和,進而比較獲得對應首個數字的最大子段和

1

int maxsum(int a, int num, int* start, int*end)12}

13}14return

localsum;

15 }

分治策略

將初始最大子段和問題分解為兩個相同的子問題;

•     分別對相同的子段求解最大子段和;

•     合併子問題的解,獲得原問題的解。

最大子段和位於左子段

最大子段和位於右子段

最大子段和的首數字位於左子段,尾數字位於右子段

1

int maxsum(int a, int left, int

right)

13int sum2 = 0; int rights = 0;14

for (int i = mid + 1; i <= right; i++)

18 localsum = sum1 +sum2;

19if (localsum < leftsum) localsum =leftsum;

20if (localsum < rightsum) localsum =rightsum;

21 } return

localsum;

22 }

動態規劃

令b[j]表示以位置 j 為終點的所有子區間中和最大的乙個

子問題:如j為終點的最大子區間包含了位置j-1,則以j-1為終點的最大子區間必然包括在其中

如果b[j-1] >0, 那麼顯然b[j] = b[j-1] + a[j],用之前最大的乙個加上a[j]即可,因為a[j]必須包含

如果b[j-1]<=0,那麼b[j] = a[j] ,因為既然最大,前面的負數必然不能使你更大

1

int maxsum(int a, int

num)214

return

localsum;

15 }

演算法效率分析

窮舉法       o(n3)

窮舉優化法   o(n2)

分治法       o(nlogn)

動態規劃法   o(n)

附帶一些完整**:

1

//動態規劃

2 # include3 # include4

int maxsum(int a,int

num)517

return

localsum;18}

19int

main()

2028

return0;

29}30//

分治演算法

31 # include32

int maxsum(int a,int left,int

right)

3346

int sum2=0; int rights=0;47

for(i=mid+1;i<=right;i++)

51 localsum=sum1+sum2;

52if(localsumleftsum;

53if(localsumrightsum;54}

55return

localsum;56}

57int

main()

5866

return0;

67}6869

//暴力解法

70 # include71

intmain()

728990}

91 printf("

%d\n

",max);92}

93return0;

94 }

view code

DP 最大連續子段和

最大連續子段和 hdu 1003 1.問題描述 給定一串整數,例如 6 1 5 4 7,求最大連續子段和?2.演算法介紹 此題不能暴力,o n 2 的時間複雜度必然超時。考慮如下演算法 設mi表示前i個整數包含第i個整數的最大連續子段和。sum i,j 表示第i個整數到第j個整數的和,最大連續子段和...

總結 最大連續子段和

給你乙個序列,讓你在其中找一段連續的子串行,使得這個連續的子串行的和是最大的。它實際上有點動態規劃的意思在裡面,設f i 表示以第i個數字作為結尾的連續子串行的和的最大可能值。則 f i max f i 1 a i a i 這裡的 f i 1 a i 實際上表示的就是,讓a i 和以a i 1 結尾...

HDU 1231 最大連續子串行(最大連續子段和)

description 求最大連續子段和,並輸出此字段的起始位置和終止位置的值 input 多組用例,每組用例第一行為序列長度n,第二行n個整數表示該序列,以n 0結束輸入 output 對每個測試用例,輸出最大連續子段和及其起始位置和終止位置的值,如果序列全為負值則令最大連續子段和為0,而起止位置...