Acwing 126 最大的和(二維字首和)

2021-09-25 14:50:05 字數 2664 閱讀 9500

給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為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 輸出一行,包...