最大子矩陣 字首和 貪心

2021-09-23 08:11:07 字數 1311 閱讀 9222

給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為1 * 1或更大的連續子陣列。

矩形的總和是該矩形中所有元素的總和。

在這個問題中,具有最大和的子矩形被稱為最大子矩形。

例如,下列陣列:

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2

其最大子矩形為:

9 2-4 1

-1 8

它擁有最大和15。

輸入格式

輸入中將包含乙個n*n的整數陣列。

第一行只輸入乙個整數n,表示方形二維陣列的大小。

從第二行開始,輸入由空格和換行符隔開的n2個整數,它們即為二維陣列中的n2個元素,輸入順序從二維陣列的第一行開始向下逐行輸入,同一行資料從左向右逐個輸入。

陣列中的數字會保持在[-127,127]的範圍內。

輸出格式
輸出乙個整數,代表最大子矩形的總和。

資料範圍
1≤n≤100

輸入樣例:
4

0 -2 -7 0 9 2 -6 2

-4 1 -4 1 -1

8 0 -2

輸出樣例:

題解: 字首和 + 貪心:

首先我們容易想到,可以列舉矩陣的左上角(x1, y1)和右下角(x2, y2) ,然後通過二維字首和算出矩陣和,這樣就可以確定我們所需要的矩陣,但是時間複雜度是o(n4),這樣的複雜度太大了,我們無法解決.所以我們可以換一種思想,貪心處理.問題是我們怎麼貪心了, 大致可以這樣大力貪心:

我們可以將二維求最大子矩陣聯想到一維的求最大子矩陣和的方式,可以先求出每一列的字首和,

然後倆個for迴圈列舉上邊界和下邊界,在用乙個for迴圈來列舉這個區間內的每一列,因為我們已經求出每一列的字首和了,所以這倆個邊界之間的每一列之和我們是知道的, 所以就可以用一維的方法來做了。

#include

#include

using namespace std;

int a[

110]

[110];

intmain()

int max =

-1e9

;for

(int i =

1; i <= n; i++)}

} cout << max << endl;

return0;

}

1224 最大子矩陣(字首和)

門2是用的一維字首和,門1的一維字首和 好像有點錯誤。直接cv了 這個 裡,這樣輸入矩陣的方式還是第一次見,字首和是計算的每一列的。include include include include include define inf 999999999 define n 1001 using nam...

最大化(矩陣字首和)

矩陣字首和 神奇的剪枝 矩陣字首和 如圖,a 2 2 的字首和就是2 3 2 7,a 1 4 的字首和就是2 3 4 8 以此類推,每乙個座標的字首和,都是該座標到矩陣左上角的數字之和 這樣,任意子矩陣的數字和,可以在o 1 時間內查詢 實現 for int i 1 i n i for int j ...

最大的和 最大子矩陣和 貪心 字首和 dp

給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為1 1或更大的連續子陣列。矩形的總和是該矩形中所有元素的總和。在這個問題中,具有最大和的子矩形被稱為最大子矩形。例如,下列陣列 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2其最大子矩形為 9 2 4 1 1 8它擁有最大...