最大子串行和問題

2021-09-18 03:31:10 字數 2939 閱讀 7191

問題描述來自pta-資料結構與演算法題目集(中文)7-1 最大子列和問題:

給定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

對 i

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)中求最大值,即為整個序列的最大子串行和

for

(int i =

0;i < num;i++)if

(sum>maxsum)

}}

但是三重迴圈在序列的 n

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]

我們之前的求解過程中存在大量的重複計算,去除重複計算也是演算法優化的一大途徑

for

(int i =

0;i < num;i++)}

}

儘管如此,整個演算法的複雜度依舊是o(n

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變數記錄,而比較也會花費時間,所以直接在迴圈中比較,求得

int maxsum = array[0]

;int sum = array[0]

;for

(int i =

1;i < num;i++

)

所以其實整個問題先將對長度為n的序列的最大子串行和化為對第0…n位的最大子串行和的求解,而第0…n位的最大子串行和可以用動態規劃的思想求解,再在0…n位的最大子串行中求取最大的,從而求解出整個序列的最大子串行和。

感謝胡凡演算法筆記其中動態規劃的講解,講解得非常細緻全面,推薦推薦

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 最大...