標籤:style blog color os io for 問題 ar
這個問題是演算法導論的一個樣本,為了講解分治。
1 //演算法導論中的分治策略版本 2 3 4 #include<iostream> 5 using namespace std; 6 int maxCrossSum(int a[], int begin, int mid, int end) 7 { 8 int sumLeft = a[mid]; 9 int sumNow=0;10 for (int i = mid; i >= begin; --i)11 {12 sumNow += a[i];13 if (sumNow > sumLeft)14 sumLeft = sumNow;15 }16 int sumRight = a[mid + 1];17 sumNow = 0;18 for (int i = mid + 1; i <= end; ++i)19 {20 sumNow += a[i];21 if (sumNow > sumRight)22 sumRight = sumNow;23 }24 return sumLeft + sumRight;25 }26 int maxSubArray(int a[], int begin, int end)27 { 28 if (begin == end)29 return a[begin]; 30 else31 {32 int mid = (begin + end) / 2;33 int leftSum = maxSubArray(a, begin, mid);34 int rightSum = maxSubArray(a, mid + 1, end);35 int crossSum = maxCrossSum(a, begin, mid, end);36 int sum;37 if (leftSum > rightSum)38 sum = leftSum;39 else sum = rightSum;40 if (sum < crossSum)41 sum = crossSum;42 return sum;43 }44 }45 int main()46 {47 const int SIZE = 13;48 int a[SIZE] = { -3, -15, 20, -3, -16, -23, 18, 20, -9, 12, -5, -22, 15 };49 int maxsubarray = maxSubArray(a, 0, 12);50 cout << maxsubarray << endl;51 system("pause");
這裡提供一個更加簡便的方法:
1 更加高效的版本,無須遞迴,O(n)的時間複雜度 2 #include<iostream> 8 using namespace std; 9 int maxSubArray(int a[], int begin, int end)10 { 11 int sum = 0;12 int i = 0;13 int maxSum = 0;14 for (int i = begin; i <= end; ++i)15 { 16 sum += a[i];17 if (sum > maxSum)18 maxSum = sum;19 //cout << maxSum << endl;20 if (sum < 0)21 sum = 0;22 }23 24 return maxSum;25 }26 int main()27 {28 const int SIZE = 13;29 int a[SIZE] = { -3, -15, 20, -3, -16, -23, 18, 20, -9, 12, -5, -22, 15 };30 int maxsubarray = maxSubArray(a, 0, 12);31 cout << maxsubarray << endl;32 system("pause");33 }
此處不得不說,後面的方法兼具大氣魄,有遠見等特點,方能如此簡單便捷!