動態規劃之最大子段和問題

來源:互聯網
上載者:User

問題描述:
給定由n個整數(包含負整數)組成的序列a1,a2,...,an,求該序列子段和的最大值。

當所有整數均為負值時定義其最大子段和為0。
依此定義,所求的最優值為:
 
例如,當(a1,a2 , a3 , a4 , a5 ,a6)=(-2,11,-4,13,-5,-2)時,

最大子段和為:

11+(-4)+13 =20
1、最大子段和問題的簡單演算法:

代碼:

#include<iostream><br />using namespace std;<br />int MaxSum(int a[],int n,int &besti,int &bestj){<br /> int sum=0;<br /> int i,j,k;<br /> for(i=1;i<=n;i++)<br /> for(j=i;j<=n;j++)<br /> {<br /> int thissum=0;<br /> for(k=i;k<=j;k++)thissum+=a[k];<br /> if(thissum>sum){<br /> sum=thissum;<br /> besti=i;<br /> bestj=j;<br /> }<br /> }<br /> return sum;<br /> }<br />int main(){<br /> int n,a[100],m,i,j,maxsum;<br /> cout<<"請輸入整數序列的元素個數n:"<<endl;<br /> cin>>n;<br /> cout<<"請輸入序列中各元素的值a[i](一共"<<n<<"個)"<<endl;<br /> //for(m=1;m<=n;i++)<br /> //cin>>a[m];<br /> for(m=0;m<n;m++)<br /> cin>>a[m];<br /> int b[100];<br /> for(m=0;m<n;m++)<br /> b[m+1]=a[m];<br /> maxsum=MaxSum(b,n,i,j);<br /> cout<<"整數序列的最大子段和是:"<<maxsum<<endl;<br /> cout<<"besti="<<i<<endl;<br /> cout<<"bestj="<<j<<endl;<br /> system("pause");<br /> }

此演算法的時間複雜度:O(n3)。

可對此演算法進行適當改進,使其時間複雜度變為:O(n2)。

代碼:

#include<iostream><br />using namespace std;<br />int MaxSum(int a[],int n,int &besti,int &bestj){<br /> int sum=0;<br /> int i,j,k;<br /> for(i=1;i<=n;i++){<br /> int thissum=0;<br /> for(j=i;j<=n;j++)<br /> {<br /> thissum+=a[j];<br /> if(thissum>sum){<br /> sum=thissum;<br /> besti=i;<br /> bestj=j;<br /> }<br /> }<br /> }<br /> return sum;<br /> }<br />int main(){<br /> int n,a[100],m,i,j,maxsum;<br /> cout<<"請輸入整數序列的元素個數n:"<<endl;<br /> cin>>n;<br /> cout<<"請輸入序列中各元素的值a[i](一共"<<n<<"個)"<<endl;<br /> //for(m=1;m<=n;i++)<br /> //cin>>a[m];<br /> for(m=0;m<n;m++)<br /> cin>>a[m];<br /> int b[100];<br /> for(m=0;m<n;m++)<br /> b[m+1]=a[m];<br /> maxsum=MaxSum(b,n,i,j);<br /> cout<<"整數序列的最大子段和是:"<<maxsum<<endl;<br /> cout<<"besti="<<i<<endl;<br /> cout<<"bestj="<<j<<endl;<br /> system("pause");<br /> }<br />

 

2、最大子段和問題的分治法:

代碼:

//最大子段和,分治演算法。T(n)=O(nlog(n))。

#include<iostream><br />using namespace std;<br />int MaxSubSum(int a[],int left,int right){<br /> int sum=0;<br /> if(left==right)sum=a[left]>0?a[left]:0;<br /> else{<br /> int center=(left+right)/2;<br /> int leftsum=MaxSubSum(a,left,center);<br /> int rightsum=MaxSubSum(a,center+1,right);<br /> int s1=0;<br /> int lefts=0;<br /> for(int i=center;i>=left;i--){<br /> lefts+=a[i];<br /> if(lefts>s1)s1=lefts;<br /> }<br /> int s2=0;<br /> int rights=0;<br /> for(int i=center+1;i<=right;i++){<br /> rights+=a[i];<br /> if(rights>s2)s2=rights;<br /> }<br /> sum=s1+s2;<br /> if(sum<leftsum)sum=leftsum;<br /> if(sum<rightsum)sum=rightsum;<br /> }<br /> return sum;<br />}<br />int main(){<br /> int n,a[100],m,maxsum;<br /> cout<<"請輸入整數序列的元素個數n:"<<endl;<br /> cin>>n;<br /> cout<<"請輸入序列中各元素的值a[i](一共"<<n<<"個)"<<endl;<br /> for(m=0;m<n;m++)<br /> cin>>a[m];<br /> int b[100];<br /> for(m=0;m<n;m++)<br /> b[m+1]=a[m];<br /> maxsum=MaxSubSum(b,1,n);<br /> cout<<"整數序列的最大子段和是:"<<maxsum<<endl;<br /> system("pause");<br /> }<br />

 

3 最大子段和問題的動態規划算法:

代碼:

//最大子段和,動態規劃,T(n)=O(n)。

#include<iostream><br />using namespace std;<br />int MaxSum(int n,int a[]){<br /> int sum=0;<br /> int b=0;<br /> for(int i=1;i<=n;i++){<br /> if(b>0)b+=a[i];<br /> else b=a[i];<br /> if(b>sum)sum=b;<br /> }<br /> return sum;<br /> }<br />int main(){<br /> int n,a[100],m,maxsum;<br /> cout<<"請輸入整數序列的元素個數n:"<<endl;<br /> cin>>n;<br /> cout<<"請輸入序列中各元素的值a[i](一共"<<n<<"個)"<<endl;<br /> for(m=0;m<n;m++)<br /> cin>>a[m];<br /> int b[100];<br /> for(m=0;m<n;m++)<br /> b[m+1]=a[m];<br /> maxsum=MaxSum(n,b);<br /> cout<<"整數序列的最大子段和是:"<<maxsum<<endl;<br /> system("pause");<br /> }<br />

 

聯繫我們

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