最大連續子段和
•給定長度為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•窮舉優化法(2次for迴圈)int maxsum(int a, int num, int &start, int &end)
9if (thissum >localsum)14}
15}16return
localsum;
17 }
第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)
•附帶一些完整**:
1view code//動態規劃
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 }
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,而起止位置...