最大子矩陣和問題

2021-05-22 11:06:39 字數 1615 閱讀 7522

給定乙個長度為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...