最大子陣 二維字首和 二維LIS

2021-09-18 02:40:56 字數 1189 閱讀 4451

description

給定乙個n*m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。

其中,a的子矩陣指在a中行和列均連續的一塊。

input

輸入的第一行包含兩個整數n, m,分別表示矩陣a的行數和列數。(1 ≤ n, m ≤ 500)

接下來n行,每行m個整數,表示矩陣a。

output

輸出一行,包含乙個整數,表示a中最大的子矩陣中的元素和。

sample input

3 3

-1 -4 3

3 4 -1

-5 -2 8

sample output
10
字首和優化可以降低乙個數量級

用s[i][j]表示第j列的 前i行元素的和

比如:對於樣例的第三列,s[1][3] = 3, s[2][3] = (3)+(-1) = 2,s[3][3] = (3)+(-1)+(8)=10

我們可以o(1)地找到一列的元素和,比如:

第三列後兩個元素和,就是s[3][3]-s[1][3] = 10-3=7

整個第三列的元素和,就是s[3][3]-s[0][3] = 10

對於矩陣元素全為負的情況,直接輸出矩陣中最大的數

對於矩陣元素存在正值的情況,是乙個二維的lis(最長上公升子串行)問題,當前和為負時則置當前和為0

#include

#include

using namespace std;

const

int maxn =

505;

const

int inf =

0x3f3f3f3f

;int s[maxn]

[maxn]

;// s[i][j]:第j列的前i行元素字首和

int g[maxn]

[maxn]

;int n, m;

intmain()

if(!flag)

int ans =0;

for(

int i =

1; i <= n; i ++

)for

(int j = i; j <= n; j ++)}

cout << ans << endl;

return0;

}

二維字首和

時間限制 1 sec 記憶體限制 128 mb 提交 155 解決 51 提交 狀態 討論版 命題人 admin 題目描述 一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n n 10000 個目標,用整數xi,yi 0 xi,yi 5000 表示目標在地圖上的位置,每個...

二維字首和

1 二維字首和 模板 二維字首和 模板題 acwing 796.子矩陣的和 s i,j 第i行j列格仔左上部分所有元素的和 1.以 x1,y1 為左上角,x2,y2 為右下角的子矩陣的和為 s x2 y2 s x1 1 y2 s x2 y1 1 s x1 1 y1 1 s x y s x y 1 s...

二維字首和

直接看乙個例子 假設給定乙個矩陣 1 2 4 3 5 1 2 4 6 3 5 9 那麼,可以推出他的二維字首和矩陣為 1 3 7 10 691522 121829 45 在二維字首和陣列中,9 1 2 5 1 15 1 2 5 1 4 2 18 1 5 6 2 1 3 即二位字首和陣列中第 i 行第...