最大子串行和問題 mooc筆記

2021-10-04 15:25:26 字數 1464 閱讀 5358

對於這個問題我們給出三種演算法:

演算法1:t(n) = o(n^2)

一種笨辦法,兩個for迴圈,起點從下標0開始,每遍歷一次就加1再遍歷,一直加到n,這樣就得到了最後的結果,思路不難但是不算好。

**如下:

int

maxsubsequencesum

(int a,

int n)

}return maxsum;

}

演算法2:t(n) = o(n)

該演算法的優點是它只對資料進行一次掃瞄,一旦完成對a[ i ]的讀入和處理,就不再需要記憶它了,具有這種特性的演算法叫做聯機演算法(on-line algorithm)

**如下:

int

submax2

(int a,

int n)

return maxsum;

}

演算法3:t(n) = o(n logn)

分治法:將問題分成兩個大致相等的子問題,然後遞迴地對它們求解。

對於這個問題,最大子串行和可能在三處出現,將序列分成兩半部分,則最大子串行可能全在左半部分,可能全在右半部分,又或者它橫跨這兩部分。有了這個思路,我們就可以用遞迴來求解,雖然相對複雜,但是體現出了遞迴的威力。

**如下:

int

max3

(int a,

int b,

int c)

intmaxsubsum

(int a,

int left,

int right)

center =

(left + right)/2

;//找到中分點,遞迴求得兩邊子列的最大和

maxleftsum =

maxsubsum

(a,left,center)

; maxrightsum =

maxsubsum

(a,center+

1,right)

;//求跨分界線的最大子列和(這裡和聯機演算法有些相似)

maxleftbordersum = leftbordersum =0;

for(i = center; i >= left; i--

) maxrightbordersum = rightbordersum =0;

for(i = center+

1; i <= right; i++

)//maxleftbordersum+maxrightbordersum就是跨分界線的最大子列和,然後三者比較

return

max3

(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum)

;}

最大子串行和問題

問題 給定一整數序列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 最大...