最大子段和問題

來源:互聯網
上載者:User

問題描述:給定長度為n的整數序列,a[1...n], 求[1,n]某個子區間[i , j]使得a[i]+…+a[j]和最大.或者求出最大的這個和.例如(-2,11,-4,13,-5,2)的最大子段和為20,所求子區間為[2,4].

求子區間及其最大值,是非常適合採用分治法德演算法設計思想來設計的,其分治的思想是把一個難以直接解決的大問題,分成一些規模較小的相同性質的問題,以便各個擊破,分而治之。如果規模為N的問題可以分解成k個子問題(1<k<=N),並且這些子問題之間相互獨立,互不影響,遞迴地解決這些問題,然後合并這些子問題的解,得到最後問題的解。

分治法的代碼實現過程如下:

int MaxSubSum(int a[],int left,int right){int sum = 0;//用來儲存最大子段和if (left == right)//只有一個元素{sum = a[left] > 0 ? a[left] : 0;}else{int center = (left + right)/2;int leftsum = MaxSubSum(a,left,center);int rightsum = MaxSubSum(a,center+1,right);//下面是第三種情況int s1 = 0,lefts = 0;for (int i = center; i >= left; i --){lefts += a[i];if (lefts > s1)s1 = lefts;}int s2 = 0,rights = 0;for (i = center+1; i <= right; i ++){rights += a[i];if (rights > s2)s2 = rights;}sum = s1 + s2;if (sum < leftsum)sum = leftsum;if (sum < rightsum)sum = rightsum;}return sum;}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.