最大連續子串行之和,最大連續子串行乘積

2021-06-26 16:19:15 字數 2446 閱讀 3651

最大連續子串行之和問題描述為:陣列中里有正數也有負數,連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。分析,對陣列a進行一遍掃瞄,sum[i] 為前i個元素中,包含第i個元素且和最大的連續子陣列,maxsum儲存當前子陣列中最大和,對於a[i+1]來說,sum[i+1] = sum[i]+a[i+1],此時如果sum[i+1]<0,那麼sum需要重新賦0,從i+1之後開始累加,如果sum[i+1]>0,那麼maxsum = max(maxsum, sum[i+1])。**如下:

1

int maxsum(int *narray, int nsize, int &nbegin, int &nend)216

else

if(nsum < 0)17

21}2223

return

nmaxsum;24}

2526

int _tmain(int argc, _tchar*argv)27;

29int nbegin = 0, nend = 0;30

int nmaxsum = maxsum(array, sizeof(array)/sizeof(*array), nbegin, nend);

31 cout

32 cout<

開始下標為[

"], 結束下標[

"<

3334

return0;

35 }

最大連續子串行乘積,問題描述和前面求最大連續子串行之和類似:給乙個浮點數序列,取最大乘積連續子串的值。這裡需要重點注意的是乘積需要注意正負號,需要考慮到有偶數個的情況,所以計算時,不止要儲存當前最大乘積,也要儲存當前最小乘積。**如下:

1

double maxproduct(double a, int nlen, int &nbegin, int &nend)221

if(dcurmin >dmax)

2227

if(dcurmax

2831

if(dcurmin

3235

36if(dcurmax == 0 || dcurmin == 0)37

4142 cout<

dmax =

", dmin =

"43 cout<

begin =

", end =

"4546

return

dmax;47}

4849

int _tmain(int argc, _tchar*argv)50;

52int

nbegin, nend;

53int max = maxproduct(a, sizeof(a)/sizeof(*a), nbegin, nend);

54 cout

55 cout

"5657

return0;

58 }

在網上看到使用動態規劃的演算法來處理此題目。假設從陣列開頭 i 到結尾 j 的範圍,求出所有元素為結尾的子串行最大值,取其中最大的那個即為所求的最大連續子串行乘積。假設max(i, k)表示從陣列 i 開始到 j 結束的範圍內,包含 j 作為結尾的最大連續子串行乘積,注意不一定以 i 作為起始,問題可以概括為max = max(max(i, i), max(i, i+1), ……, max(a, k), ……., max(i, j)) 。那麼對於max(i, k)後面的max(i, k+1)來說,會有如下幾種情況:

max(i, k)和a[k+1]均為正數,且max(i, k)*a[k+1] > max(i, k),那麼有 max(i, k+1) = max(i, k) * a[k+1]

max(i, k)和a[k+1]一正一負,如果max(i, k)>0,a[k+1] < 0,那麼乘積<0,而max(i, k+1)要包含a[k+1],所以max(i, k+1) = a[k+1],反之亦然

max(i, k)為正數,a[k+1]為負數,不過max(i, k)之前相連的序列裡有負數,那麼前面包含負數的這個序列,必然是乙個前面序列的最小值,此時max(i, k+1) = min(i, k) * a[k+1]

概括起來,包含第k+1個元素為結尾的序列最大乘積應該取自上述三種情況之一:max(i, k+1) = max(max(i, k) * a[k+1],  a[k+1], min(i, k) * a[k+1])。

按照同樣的道理,我們求得的包含k+1在內結尾的最小乘積序列為:min(i, k+1) = min(min(i, k) * a[k+1], a[k+1], max(i, k) * a[k+1])。

**如下:

1

int maxproduct_dp(double a, intn)2

1920

return

result;

21 }

分類: 

演算法題

最大連續子串行之和

窮舉法思路 1,3,4,5最大子串行為4 5 9,4 2 3 5 最大子串行為4 2 3 5 10 窮舉數列的每個區間,將區間內的數相加,更新最大值,每計算乙個區間後求和的sum要清0 include main sum 0 進入下次計算sum清0 printf d max 非列舉思路 當輸入的數全為...

最大連續子串行之和

問題描述 leyni得到了乙個長度為n的序列,xiange要求leyni最多可以修改其中k個元素,每次修改的規則是只能將乙個數字修改為其相反數。leyni想知道在修改後,他能得到的所有長度為len的連續子串行中,最大的 子串行和的絕對值 為多少?input 輸入包含多組測試資料。對於每組測試資料 第...

最大連續子串行

e 最大連續子串行 description 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加乙個要求,即還需要輸出該 子串行...