最大子序列和問題
阿新 • • 發佈:2018-05-17
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(constint 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 else17 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 }
動態規劃:
最大子序列和問題