問題描述:給定乙個整數序列(可能有負數),求一子串行(記為l『)使得該子串行所有元素之和最大。例:給定序列-2,11,-4,13,-5,-2,則最大子串行和為20(11,-4,13)
方法一:遍歷窮舉——o(n^2)
略方法二:分治遞迴——o(n*logn)
思路:將輸入序列l分為左右兩個子串行l1和l2,則l』只可能以下面三種情況出現:
因此,前兩種情況實際上是一種遞迴,對於情況三,可以採用遍歷。最後,求出三種情況中最大的那個,即是所求最終結果
方法三:動態規劃——o(n)
思路:不斷計算子串行的和,若大於當前最大子串行和,則更新;若當前子串行和小於0,只會為後續序列增加負擔,因此全部丟棄,繼續掃瞄(思考一下,l『中包含最左邊元素的任意子序列的和都不可能小於0,否則l』就不可能是l中具有最大和的子串行)
想想,若子串行(a[s], ..., a[t])之和小於0,為什麼全部丟棄而不考慮(a[s+1], ..., a[t])或者(a[s+2], ... a[t])呢?因為既然走到這一步,說明(a[s], ..., a[t])左邊任意部分如(a[s])或者(a[s], a[s+1])它們各自的和不可能小於0,否則早就被丟棄了。因此,(a[s+1], ..., a[t])或者(a[s+2], ... a[t])只可能比(a[s], ..., a[t])更小。也就是說,若(a[s], ..., a[t])小於0,則(a[s+1], ..., a[t])或者(a[s+2], ... a[t])必然小於0,帶上它們只會給後續序列增加負擔
利用動態規劃演算法的**如下:
int max_subseq_sum(int a, int n)
return max_sum;
}
最大子串行和問題
問題 給定一整數序列a1,a2,an 可能有負數 求a1 an的乙個子串行ai aj,使得ai到aj的和最大 例如 整數序列 2,11,4,13,5,2,5,3,12,9的最大子串行的和為21。對於這個問題,最簡單也是最容易想到的那就是窮舉所有子串行的方法。利用三重迴圈,依次求出所有子串行的和然後取...
最大子串行和問題
問題描述 求 2,11,4,13,5,2 的最大子串行和。方法一 使用3層for迴圈巢狀,窮舉式的嘗試所有的可能,如下 public class demo1 return maxsum public static void main string args system.out.println 最大...
最大子串行和問題
問題 給定一整數序列a1,a2,an 可能有負數 求a1 an的乙個子串行ai aj,使得ai到aj的和最大 例如 整數序列 2,11,4,13,5,2,5,3,12,9的最大子串行的和為21。對於這個問題,最簡單也是最容易想到的那就是窮舉所有子串行的方法。利用三重迴圈,依次求出所有子串行的和然後取...