最大連續子串行之和問題描述為:陣列中里有正數也有負數,連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。分析,對陣列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在網上看到使用動態規劃的演算法來處理此題目。假設從陣列開頭 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)來說,會有如下幾種情況: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 }
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。在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加乙個要求,即還需要輸出該 子串行...