最大和子序列問題

來源:互聯網
上載者:User

標籤: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 }  

此處不得不說,後面的方法兼具大氣魄,有遠見等特點,方能如此簡單便捷!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.