給定乙個長度為n的一維的陣列matrix[n],讓求其最大matrix[i] + matrix[i+1] + ... + matrix[j] = sum問題?
簡單演算法:
窮舉法先預處理map[n]表示從matrix[0]->matrix[n]的和
for(int i = 0 to n)
for(int j = i+1 to n)
int tmp = map[j] - map[i-1];
}演算法時間複雜度為o(n^2).
空間額外佔據o(n)。
dp演算法:
設max[j]為matrix[0....j]中的最大子段之和,max[j]當前只有兩種情況:
1)最大子段一直連續到matrix[j]; (2)以matrix[j]為起點的子段。
注意!如果當前最大子段沒有包含matrix[j],如果沒有包含的話,在算max[j]之前我們就已經算出來了。
得到max[j]的狀態轉移方程為:max[j] = max
所求的最大子段和為max
給定乙個二維的陣列matrix[n][n],讓求其最大子矩陣和問題?
原始演算法:
遍歷每乙個子矩陣,左上角為[x,y],右下角為[c, r],可知子矩陣共有o(n^4);
而每個子矩陣算總和的演算法複雜度為o(n^2);
---->原始演算法複雜度為o(n^6),時間複雜度太高,但是卻無額外空間。
改進演算法二:
遍歷每乙個子矩陣,左上角為[x, y],右下角為[c, r],子矩陣共有o(n^4);
但是每個子矩陣算和,時間複雜度可以優化為o(1)。
利用到額外空間map[n][n],其中map[x][y]表示左上角為[0, 0],右下角為[x, y]的子矩陣和。
左上角為[x, y],右下角為[c, r],子矩陣的和 = map[c][r] - map[x-1][r] - map[x][r-1] + 2*map[c-1][r-1]。
時間複雜度總共為o(n^4);
額外空間o(n^2)。
改進演算法三:
利用額外空間o(n^3),記錄子矩陣map[i][j][y],第y列的第i行到第j行的和。
1)以i行開始,j行結束的子矩陣,總共有n個。計算每個子矩陣的演算法複雜度為o(1)。
2)i行開始,j行結束。2變數,兩個變數,複雜度為o(n^2)。
可知該演算法可以用o(n^3)的時間複雜度算出,但其代價是空間複雜度也是o(n^3)。
改進演算法四:
相比演算法三,僅是優化了空間複雜度,將其降低為o(n^2)。
子矩陣和map[x][y]表示第y列從第1行到第i行的和。
演算法三的map[i][j][k] = map[j][k] - map[i-1][k]即可。不用都記錄下來
參考:http://www.360doc.com/content/10/0423/13/1283481_24497771.shtml
最大子矩陣問題
thinking開始令pos1 1,pos2 1 先判斷pos1 pos2高度的每個格仔,取或者不取,得出一維也就是只有第一行的最大子矩陣。然後pos2 因為是要求連續子矩陣,那麼從第一行到第二行的子矩陣相加,就相當與只判斷一行,可以找出pos1 1到pos2 2也就是第一行到第二行且只取這兩行作為...
多行最大子矩陣和問題
題目描述 給定n n矩陣,矩陣元素都是 127到 127之間的整數。請找到乙個子矩陣,使得其元素之和最大。例如給定4 4矩陣 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 最大子矩陣為 9 2 4 1 1 8 最大子矩陣和為9 2 4 1 1 8 15.輸入資料 多組測試資料,每組...
最大子段和 最大子矩陣和
給出n個整數序列 可能為負數 組成的序列a1,a2,an,求該序列形如 的子段和的最大值。當所有整數均為負數時,定義最大子段和為0。多測試用例。每個測試用例佔2行 第一行是序列的個數n 0 n 10000 第二行是n個整數。為每個測試用例輸出一行結果 最大子段和。6 2 11 4 13 5 2 31...