最大子串行和的求法

2021-08-21 18:02:39 字數 1277 閱讀 7696

定義:

給定整數a1a_

a1​,a2a_

a2​,a3a_

a3​,……,ana_

an​(可能有複數),求∑k=

ijak

\sum_^ja_

∑k=ij​

ak​的最大值(為方便起見,如果所有整數均為負數,則最大子串行和為0)。

演算法一:

int maxsubsequencesum(const int a, int n)

return maxsum;

}

注:該種演算法會進行大量不必要的計算,執行效率較低。

演算法二:

int maxsubsequencesum(const int a, int n)

} return maxsum;

}

注:演算法二是演算法一的改進版本,相比於演算法一,演算法二減少了乙個for迴圈,減少了不必要運算,提高了執行效率。

演算法三:

static int maxsubsum(const int a, int left, int right)

maxrightbordersum = 0;

rightbordersum = 0;

for(i = center + 1; i <= right; i++)

return max3(maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum); /*偽**,取三個數值中最大的乙個*/

} int maxsubsequencesum(const int a, int n)

注:演算法三採用了「分治」策略,它的**雖然長,但比演算法二更加高效。其想法是把問題分成兩個大致相等的子問題,然後遞迴地對它們求解,這是「分」部分。「治」階段將兩個子問題的解合併到一起並可能再做些少量的附加工作,最後得到整個問題的解。

在求最大子串行和的問題中,最大子串行和可能在三處出現。或者出現在輸入資料的左半部,或者出現在輸入資料的右半部,或者跨越輸入資料的中部從而佔據左右兩半部分。

前兩種情況可以用遞迴求解。第三種情況的最大和可以通過求出前半部分的最大和(包含前半部分的最後乙個元素)以及後半部分的最大和(包含後半部分的第乙個元素)而得到。然後將這兩個和加在一起。

演算法四:

int maxsubsequencesum(const int a, int n)

return maxsum;

}

注:演算法四隻用了乙個for迴圈,實現起來比遞迴演算法簡單而且更為有效。

最大子串行和(分治求法)

這已經是一道家喻戶曉的題了,給出乙個陣列,裡面是一串數字,求出子串行中和最大的,輸出這個和。思路 這道題有很多經典解法,其中最典型應該是動態規劃,而我們今天要討論的是用二分法怎麼求解這道題。include using namespace std int aleng int f int a,int b...

和最大子串行

問題描述 第一行輸入乙個正整數n 1 n 100001 第二行輸入n個整數a 0 a 10000 求該組整數子串行最大的和。解決這個問題應該考慮輸入n較大的情況,也就是說,輸入100000個數字判斷它的和最大子串行應當也能很快地算出來。我看過很多求解的 有三重for迴圈的,有兩重for迴圈的,也有使...

最大子串行和

最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 它的和是8,達到最大 而 的最大子串行是,它的和是6。找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子串行的和,最後找到和最大的子...