給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為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輸入樣例:
48 0 -20 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1
輸出樣例:
題解: 字首和 + 貪心:首先我們容易想到,可以列舉矩陣的左上角(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它擁有最大...