最大子串和

2021-07-22 12:56:25 字數 1345 閱讀 8630

要說明kadane演算法的正確性,需要兩個結論。首先,對於array[1…n],如果array[i…j]就是滿足和最大的子串,那麼對於任何k(i<=k<=j),我們有array[i…k]的和大於0。因為如果存在k使得array[i…k]的和小於0,那麼我們就有array[k+1…j]的和大於array[i…j],這與我們假設的array[i…j]就是array中和最大子串矛盾。

其次,我們可以將陣列從左到右分割為若干子串,使得除了最後乙個子串之外,其餘子串的各元素之和小於0,且對於所有子串array[i…j]和任意k(i<=k<=j), 有array[i…k]的和大於0。此時我們要說明的是,滿足條件的和最大子串,只能是上述某個子串的字首,而不可能跨越多個子串。我們假設array[p…q],是array的和最大子串,且array[p…q],跨越了array[i…j],array[j+1…k]。根據我們的分組方式,存在 i<=m<=j 使得array[i…m]的和是array[i…j]中的最大值,存在 j+1<=n<=k使得array[j+1…n]的和是array[j+1…k]的最大值。由於array[m+1…j]使得array[i…j]的和小於0。此時我們可以比較array[i…m]和array[j+1…n],如果array[i…m]的和大於array[j+1…n]則array[i…m]>array[p…q],否array[j+1…n]>array[p…q],無論誰大,我們都可以找到比array[p…q]和更大的子串,這與我們的假設矛盾,所以滿足條件的array[p…q]不可能跨越兩個子串。對於跨越更多子串的情況,由於各子串的和均為負值,所以同樣可以證明存在和更大的非跨越子串的存在。對於單元素和最大的特例,該結論也適用。

根據上述結論,我們就得到了kadane演算法的執行流程,從頭到尾遍歷目標陣列,將陣列分割為滿足上述條件的子串,同時得到各子串的最大字首和,然後比較各子串的最大字首和,得到最終答案。我們以array=為例,來簡單說明一下演算法步驟。通過遍歷,可以將陣列分割為如下3個子串(-2),(1,-3),(4,-1,2,1,-5,4),這裡對於(-2)這樣的情況,單獨分為一組。各子串的最大字首和為-2,1,6,所以目標串的最大子串和為6。

參考

#include

#define maxsize 100

using

namespace

std;

int maxsum(int,int);

int main(void)

cout

0;

} int maxsum(int

array,int n)

else

if(b>sum)

} return sum;

}

最大子串和

本文討論的最大子串和指的是在乙個數字序列中,求出所有子串各數字之和最大 對於給定的乙個數字序列,這裡以為例說明 示例則是普遍對於整型數字序列 先給出 不懂的讀者再看講解 include using namespace std int a 1010 long maxsubstr int a,int n...

最大子串和問題

問題 給定一組數字,求連續的字串的最大的和。這裡要注意題目中是子串和而不是子串行和。子串行只要求各元素的順序與其在陣列中一致,而沒有連續的要求。如果求子序列,可直接把這組數字中的正數相加即可。最開始想著只要把這組數字中各個正數子串行分別求和,比較哪個大就行了,後來發現不對。比如 正數子串行分別為,其...

最大子串和問題(Maximum Subarray)

又乙個經典問題,對於乙個包含負值的數字串array 1.n 要找到他的乙個子串array i.j 0 i j n 使得在array的所有子串中,array i.j 的和最大。這裡我們需要注意子串和子串行之間的區別。子串是指數組中連續的若干個元素。子串行只要求各元素的順序與其在陣列中一致,而沒有連續的...