給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為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,表示方形二維陣列的大小。
從第二行開始,輸入由空格和換行符隔開的n
2n^2
n2個整數,它們即為二維陣列中的n
2n^2
n2個元素,輸入順序從二維陣列的第一行開始向下逐行輸入,同一行資料從左向右逐個輸入。
陣列中的數字會保持在[-127,127]的範圍內。
輸出格式
輸出乙個整數,代表最大子矩形的總和。
資料範圍
1≤n≤1001≤n≤100
輸入樣例:
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
輸出樣例:
15
難度:簡單
時/空限制:1s / 64mb
總通過數:168
總嘗試數:293
思路:方法一:
我們可以使用二維字首和來做,我們需要遍歷子矩形的左上點(i, j)和右下點(k,p),通過二維字首和來求出矩形中元素的和。
我們可以推出f[i
][j]
=f[i
−1][
j]+f
[i][
j−1]
+a[i
][j]
−f[i
−1][
j−1]
f[i][j] = f[i-1][j] + f[i][j-1] + a[i][j] - f[i-1][j-1]
f[i][j
]=f[
i−1]
[j]+
f[i]
[j−1
]+a[
i][j
]−f[
i−1]
[j−1
]當我們求左上點為(i,j),右下點為(k,p)的矩陣和時,我們可以得出
v al
=f[k
][p]
−f[k
][j]
−f[i
][p]
+f[i
][j]
val =f[k][p]- f[k][j]-f[i][p]+f[i][j]
val=f[
k][p
]−f[
k][j
]−f[
i][p
]+f[
i][j
]直接暴力找兩個點,複雜度o(n
4)o(n^4)
o(n4)
**:
#include
using
namespace std;
const
int maxn =
105;
int a[maxn]
[maxn]
;int sum[maxn]
[maxn]
;const
int inf =
-0x3f3f3f3f
;int
main()
}int maxx = inf;
for(
int i =
0; i <= n; i++)}
}}cout << maxx << endl;
return0;
}
方法二:我們可以先用求一維最大連續子串行的和來求。二維我們可以把幾層的高度和為一層來算。這樣我們就變為了一維。
AcWing 126 最大的和
給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為1 1或更大的連續子陣列。矩形的總和是該矩形中所有元素的總和。在這個問題中,具有最大和的子矩形被稱為最大子矩形。例如,下列陣列 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 其最大子矩形為 9 2 4 1 1 8 它擁有...
AcWing 126最大的和
題目描述 給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為1 1或更大的連續子陣列。矩形的總和是該矩形中所有元素的總和。在這個問題中,具有最大和的子矩形被稱為最大子矩形。例如,下列陣列 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2其最大子矩形為 9 2 4 1 1 8...
最大子陣 二維字首和 二維LIS
description 給定乙個n m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。input 輸入的第一行包含兩個整數n,m,分別表示矩陣a的行數和列數。1 n,m 500 接下來n行,每行m個整數,表示矩陣a。output 輸出一行,包...