分析: 我們已經解決了一維的問題(基礎篇中的最大子段和問題),現在變成二維了,我們看看能不能把這個問題轉化為一維的問題。最後子矩陣一定是在某兩行之間的。假設我們認為子矩陣在第i行和第j列之間,我們如何得到i和j呢,對,列舉。 列舉所有1<=i<=j<=m,表示最終子矩陣選取的行範圍。
我們把每一列第i行到第j行之間的和求出來,形成乙個陣列c,於是乙個第i行到第j行之間的最大子矩陣和對應於這個和陣列c的最大子段和。於是,我們的演算法變為:
//計算第每列第i行到第j列的和
for k = 1 to n do
c[k] = (j == i)?a[i][k] : (c[k] + a[j][k])
endfor
//求c的最大子段和 記錄全域性最優結果
endfor
endfor
我們看看標為紅色的部分 就是求每列第i行到第j行之間的所有數的和,我們沒有再用乙個迴圈求,而是隨著j的增長,每次把第j行的結果疊加到之前的和上。 另外求c的最大子陣列和是個線性時間演算法,實際上它可以和那個k的for迴圈合併在一起,不過不影響時間複雜度。時間複雜度是o(m^2n)。
模板 動態規劃之最大子段和 最大子矩陣問題
給出一段序列,選出其中連續且非空的一段使得這段和最大。input 第一行是乙個正整數n n 200000 表示了序列的長度。第接下來的n行包含n個絕對值不大於10000的整數a i 描述了這段序列。output 僅包括1個整數,為最大的子段和是多少。子段的最小長度為1。sample input 2 ...
動態規劃之最大子陣列
問題 乙個有n個整數元素的一位陣列 a 0 a 1 a n 1 a n 這個陣列當然有很多子陣列,那麼陣列之和的最大值是什麼呢?public class maxchildarray int sum new int numbers.length sum 0 numbers 0 for int i 1 ...
動態規劃之最大子陣列
最近很慌自己演算法這一塊,想著去領扣上練一下,然後遇到了一道最大連續子陣列的問題,感覺似曾相識,就是想不起來怎麼做。雖說可以用暴力法來解,但是那樣的話就沒有什麼練習的必要了。題目大致如下 給定乙個陣列,求它的最大連續子陣列,這裡的最大指的是子陣列之和最大,陣列中可能有正數 負數或者0。因為之前接觸過...