問題描述來自pta-資料結構與演算法題目集(中文)7-1 最大子列和問題:對 i給定k個整數組成的序列,「連續子列」被定義為,其中 1≤i≤j≤k。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。
本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下:
資料1:與樣例等價,測試基本正確性;
資料2:102個隨機整數;
資料3:103個隨機整數;
資料4:104個隨機整數;
資料5:105個隨機整數;
輸入格式:
輸入第1行給出正整數k (≤100000);第2行給出k個整數,其間以空格分隔。
輸出格式:
在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。
輸入樣例:
6-2 11 -4 13 -5 -2
輸出樣例:
20
ii 從0...
n0...n
0...n,j
jj 從 0...
n0...n
0...
n 求sum
(i,j
)sum(i,j)
sum(i,
j),其中sum
(i,j
)=ni
+ni+
1+..
.+nj
sum(i,j)=n_i+n_+...+n_j
sum(i,
j)=n
i+n
i+1
+...
+nj
在所有sum
(i,j
)sum(i,j)
sum(i,
j)中求最大值,即為整個序列的最大子串行和
但是三重迴圈在序列的 nfor
(int i =
0;i < num;i++)if
(sum>maxsum)
}}
nn 較大時會超時
在求s um
(i,j
)sum(i,j)
sum(i,
j)的過程中,其實有sum
(i,j
+1)=
sum(
i,j)
+arr
ay[j
+1
]sum(i,j+1)=sum(i,j)+array[j+1]
sum(i,
j+1)
=sum
(i,j
)+ar
ray[
j+1]
我們之前的求解過程中存在大量的重複計算,去除重複計算也是演算法優化的一大途徑
儘管如此,整個演算法的複雜度依舊是o(nfor
(int i =
0;i < num;i++)}
}
2)
o(n^2)
o(n2
),這開銷依舊是十分巨大的。
最大子串行和問題是動態規劃中最為經典的問題之一,所以已知可以用動態規劃的思想去求解。
對於乙個長度為 i
ii 的序列,我們求其到達第 i
ii 位時最大子串行和sum
[i
]sum[i]
sum[i]
,可以先求到達其前 i−1
i-1i−
1 項的最大子串行和sum
[i−1
]sum[i-1]
sum[i−
1],看該和與第 i
ii 項相加後與第 i
ii 項比較的結果,從而我們可以得到狀態轉移方程
s um
[i]=
max(
sum[
i−1]
+arr
ay[i
],ar
ray[
i]),
其中i≥
1sum[i] = max(sum[i-1]+array[i],array[i]),其中i\geq1
sum[i]
=max
(sum
[i−1
]+ar
ray[
i],a
rray
[i])
,其中i
≥1對於長度為n
nn的序列,我們求出長度為0..
n0..n
0..n
的子串行和sum
[0].
..su
m[n]
sum[0]...sum[n]
sum[0]
...s
um[n
]後,對整個sum陣列進行比較後可以在其中求出整個序列的最長子序列和maxsum
。
因為儲存sum
[0..n]
sum[0..n]
sum[0.
.n]會耗費成本,所以在演算法中只是用sum
變數記錄,而比較也會花費時間,所以直接在迴圈中比較,求得
所以其實整個問題先將對長度為n的序列的最大子串行和化為對第0…n位的最大子串行和的求解,而第0…n位的最大子串行和可以用動態規劃的思想求解,再在0…n位的最大子串行中求取最大的,從而求解出整個序列的最大子串行和。int maxsum = array[0]
;int sum = array[0]
;for
(int i =
1;i < num;i++
)
感謝胡凡演算法筆記其中動態規劃的講解,講解得非常細緻全面,推薦推薦
4.13號不小心誤刪覆蓋了一次,沒實現恢復,不管了,先貼**,有心情再來重新寫
4.14號重新寫了一次,但是覺得仍有紕漏
最大子串行和問題
問題 給定一整數序列a1,a2,an 可能有負數 求a1 an的乙個子串行ai aj,使得ai到aj的和最大 例如 整數序列 2,11,4,13,5,2,5,3,12,9的最大子串行的和為21。對於這個問題,最簡單也是最容易想到的那就是窮舉所有子串行的方法。利用三重迴圈,依次求出所有子串行的和然後取...
最大子串行和問題
問題描述 給定乙個整數序列 可能有負數 求一子串行 記為l 使得該子串行所有元素之和最大。例 給定序列 2,11,4,13,5,2,則最大子串行和為20 11,4,13 方法一 遍歷窮舉 o n 2 略方法二 分治遞迴 o n logn 思路 將輸入序列l分為左右兩個子串行l1和l2,則l 只可能以...
最大子串行和問題
問題描述 求 2,11,4,13,5,2 的最大子串行和。方法一 使用3層for迴圈巢狀,窮舉式的嘗試所有的可能,如下 public class demo1 return maxsum public static void main string args system.out.println 最大...