問題描述:
已知序列 a[0]、a[1]、a[2]、…、a[n],要求出連續子串行a[i]、a[i+1]、a[i+2]、…、a[j](0<=i<=j<=n),使其和最大。
演算法1:暴力列舉,簡單,但是效率不高。由於有三層迴圈,故時間複雜度為o(n^3)。
max=a[0];//max不能為0
for(i=0;i<=n;i++)
if(sum>max)
max=sum;
}}
演算法2:列舉演算法優化。設s[i]=a[0]+a[1]+a[2]+…+a[i],則a[i]+a[i+1]+a[i+2]+…+a[j]=s[j]-s[i-1]。主要的時間消耗在二層迴圈中,故時間複雜度為o(n^2)。
s[0]=a[0];
for(i=1;i<=n;i++)
s[i]=s[i-1]+a[i];
max=a[0];
for(j=0;j<=n;j++)//起點為0的序列
for(i=1;i<=n;i++)
}
演算法3:遞迴分治
遞迴分治的一般思路:
(1)將原問題劃分成若干子問題。
(2)遞迴求解子問題。
(3)將子問題合併,求得原問題的解。
最大連續子串行的遞迴分治演算法:
(1)劃分問題:將子串行劃分成長度大致相等的左右兩部分。
(2)求解子問題:分別求解左、右子串行的最優解。
(3)合併問題:最大連續子串行的解只可能有以下三種情況:只在左半部分、只在右半部分、「橫跨」左右兩大部分(即起點位於左半部分、終點位於右半部分)。在第二步中已經求出了左、右兩部分的最優解了,在此,只需求出起點在左半部分、終點在右半部分的最大子串行,並把它和左半部分、右半部分的最大解作比較,求出最大解。
時間複雜度分析:t(n)=2*t(n/2)+o(n),t(1)=1.
2*t(n/2)是因為將原問題分成兩個長度大致相同的左右兩部分。
o(n)是因為合併時掃瞄整個序列。
t(n)=2*t(n/2)+n
=4*t(n/4)+2n
=8*t(n/8)+3n
=16*t(n/16)+4n
…. =n*t(1)+nlogn(以2為底)
=o(nlogn)
故時間複雜度為o(nlogn).
//求[x,y]的最大連續子串行和,返回值即為最大連續子串行和
int maxsum(int *a,int x,int y)
最大連續子串行之和,最大連續子串行乘積
最大連續子串行之和問題描述為 陣列中里有正數也有負數,連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。分析,對陣列a進行一遍掃瞄,sum i 為前i個元素中,包含第i個元素且和最大的連續子陣列,maxsum儲存當前子陣列中最大和,對於a i 1 來說,sum i ...
最大連續子串行
e 最大連續子串行 description 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加乙個要求,即還需要輸出該 子串行...
最大連續子串行
給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加乙個要求,即還需要輸出該 子串行的第乙個和最後乙個元素。input 測試輸入...