演算法之最大子矩陣問題(壓縮矩陣)

2021-10-04 09:33:05 字數 935 閱讀 4545

最大子矩陣和問題。給定m行n列的整數矩陣a,求矩陣a的乙個子矩陣,使其元素之和最大。

輸入格式:

第一行輸入矩陣行數m和列數n(1≤m≤100,1≤n≤100),再依次輸入m×n個整數。

輸出格式:

輸出第一行為最大子矩陣各元素之和,第二行為子矩陣在整個矩陣中行序號範圍與列序號範圍。

輸入樣例

5 6

60 3 -65 -92 32 -70

-41 14 -38 54 2 29

69 88 54 -77 -46 -49

97 -32 44 29 60 64

49 -48 -96 59 -52 25

輸出樣例

321

2 4 1 6

雖然最大子矩陣可以通過暴力求解直接解出來,不過時間複雜度太大 一般採用矩陣壓縮的方法去求最大子矩陣

將矩陣壓縮完之後,利用最大子串行求解。

#includeusing namespace std;

int matrix[100][100];

/** * 從第一行開始,逐漸將1行、2行、3行當做一行得出最大值

* * 找出最大子字段和即可

*/int main()

else

}for(int p=0;pmax)

}delete dp;

delete start;}}

printf("%d\n",max);

printf("%d %d %d %d",startrow+1,endrow+1,startcol+1,endcol+1);

cin.get();

return 0;

}

最大子矩陣問題

thinking開始令pos1 1,pos2 1 先判斷pos1 pos2高度的每個格仔,取或者不取,得出一維也就是只有第一行的最大子矩陣。然後pos2 因為是要求連續子矩陣,那麼從第一行到第二行的子矩陣相加,就相當與只判斷一行,可以找出pos1 1到pos2 2也就是第一行到第二行且只取這兩行作為...

模板 動態規劃之最大子段和 最大子矩陣問題

給出一段序列,選出其中連續且非空的一段使得這段和最大。input 第一行是乙個正整數n n 200000 表示了序列的長度。第接下來的n行包含n個絕對值不大於10000的整數a i 描述了這段序列。output 僅包括1個整數,為最大的子段和是多少。子段的最小長度為1。sample input 2 ...

動態規劃之最大子矩陣和

分析 我們已經解決了一維的問題 基礎篇中的最大子段和問題 現在變成二維了,我們看看能不能把這個問題轉化為一維的問題。最後子矩陣一定是在某兩行之間的。假設我們認為子矩陣在第i行和第j列之間,我們如何得到i和j呢,對,列舉。列舉所有1 i j m,表示最終子矩陣選取的行範圍。我們把每一列第i行到第j行之...