求最大子串行和及其位置(四種經典方法)

2021-06-05 21:13:42 字數 1615 閱讀 9831

演算法部分

#include #include using namespace std;

////

////

//s(tart)表示最大子串行的開始位置,e(nd)表示結束位置

//這裡如果有多於乙個的最大子串行的時候,只記錄開始位置最低的那個

int s=0;

int e=0;

//窮舉法,複雜度o(n^3)

long maxsubsum1(const vector&a)

} }return maxsum;

}//也是窮舉法,不過減去了上面的一些不必要操作o(n^2)

long maxsubsum2(const vector&a)

} }return maxsum;

}long max3(long a, long b, long c)

long maxsumrec(const vectora, int left, int right)

int center=(left+right)/2;

long maxleftsum=maxsumrec(a,left,center);

long maxrightsum=maxsumrec(a,center+1,right);

//某段序列中,求含最右側元素序列和的最大值

long maxleftbordersum=0,leftbordersum=0;

for (int i=center; i>=left; i--) }

//某段序列中,求含最左側元素序列和的最大值

long maxrightbordersum=0,rightbordersum=0;

for (int j=center+1; j<=right; j++) }

return max3(maxleftsum,maxrightsum,

maxleftbordersum+maxrightbordersum);

}//該方法我們採用「分治策略」(divide-and-conquer),相對複雜的o(nlogn)的解法

//最大子串行可能在三個地方出現,或者在左半部,或者在右半部,

//或者跨越輸入資料的中部而佔據左右兩部分。前兩種情況遞迴求解,

//第三種情況的最大和可以通過求出前半部分最大和(包含前半部分最後乙個元素)

//以及後半部分最大和(包含後半部分的第乙個元素)相加而得到。

long maxsubsum3(const vector&a)

//如果a[i]是負數那麼它不可能代表最有序列的起點,因為任何包含a[i]的作為起點的子

//序列都可以通過用a[i+1]作為起點來改進。類似的有,任何的負的子串行不可能是最優

//子串行的字首。例如說,迴圈中我們檢測到從a[i]到a[j]的子串行是負數,那麼我們就可以推進i。

//關鍵的結論是我們不僅可以把i推進到i+1,而且我們實際可以把它一直推進到j+1。

long maxsubsum4(const vector&a)

else if(thissum<0)

} return maxsum;

}

測試程式

int main()

四種求最大子串行和問題的解

include includeusing namespace std int maxsubsum1 const vector a return maxsum int main size t size sizeof a sizeof int vectorvec a,a size cout includ...

最大子串行和的四種演算法

1.窮舉法 演算法思想 算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較 演算法 public static int maxsubsum1 int a if sum maxsum return maxsum 執行時間為o n 3 2.對上述第乙個演算法的改進 演算法思想 第乙...

最大子串行和的四種演算法

算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較。執行時間為o n 3 maxsum 0 nums d n int input 輸入陣列長度 for i in range 0 n k int input 輸入資料 for i in range 0 len nums for j...