1. 程式人生 > >最大子序列和問題

最大子序列和問題

class 輸入數據 bsp sub == order color 解決辦法 可能

問題描述:

給定一整數序列A1, A2,... ,An (可能有負數),求A1~An的一個子序列Ai~Aj,使得Ai到Aj的和最大。

解決辦法:

分治法:最大子序列和可能出現在三個地方:整個出現在輸入數據的左半部分,整個出現在輸入數據的右半部分,或者跨越輸入數據的中部從而占據左右兩個半部分。

 1 double max3(double a, double b, double c){
 2     int d;
 3     d = (a > b) ? a : b;
 4     return (d > c) ? d : c;
 5 }
 6 
 7 int MaxSubSum(const
int A[], int left, int right){ 8 int center = 0; 9 int maxleftsum = 0, maxrightsum = 0; 10 int leftbordersum = 0, rightbordersum = 0; 11 int maxleftbordersum = 0, maxrightbordersum = 0; 12 13 if(left == right) 14 if(A[left] > 0) 15 return A[left]; 16 else
17 return 0; 18 else 19 ; 20 21 center = (left + right) / 2; 22 maxleftsum = MaxSubSum(A, left, center); 23 maxrightsum = MaxSubSum(A, center + 1, right); 24 25 for(int i = center; i >= left; i--){ 26 leftbordersum += A[i]; 27 if(leftbordersum > maxleftbordersum)
28 maxleftbordersum = leftbordersum; 29 } 30 31 for(int i = center + 1; i <= right; i++){ 32 rightbordersum += A[i]; 33 if(rightbordersum > maxrightbordersum) 34 maxrightbordersum = rightbordersum; 35 } 36 37 return max3(maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum); 38 } 39 40 int MaxSubsequenceSum(const int A[], int N){ 41 return MaxSubSum(A, 0, N - 1); 42 }

動態規劃:

最大子序列和問題