最大0,1子矩陣

時間限制(普通/Java):6000MS/20000MS          運行內(nèi)存限制:65536KByte
總提交:437            測試通過:77

描述

在一個0,1方陣中找出其中最大的全0子矩陣,所謂最大是指O的個數(shù)最多

 

輸入

單組數(shù)據(jù)第一行為整數(shù)N,其中1<=N<=2000,為方陣的大小,緊接著N行每行均有N01,相鄰兩數(shù)間嚴格用一個空格隔開

 

輸出

輸出僅一行包含一個整數(shù)表示要求的最大的全零子矩陣中零的個數(shù)

 

樣例輸入

5
0 1 0 1 0
0 0 0 0 0
0 0 0 0 1
1 0 0 0 0
0 1 0 0 0

樣例輸出

9

這題只能用O(n^2)的方法,O(n^3)的dp會超時。
這時可以一行一行地推,設(shè)置一個h[i]代表從第一行到當(dāng)前行,第i列的連續(xù)0的個數(shù)(當(dāng)前行第i列為0)。設(shè)置l[],r[]數(shù)組代表某行高度為>=h的左右邊界。
則對于
0 1 0 1 0
0 0 0 0 0
0 0 0 0 1
1 0 0 0 0
0 1 0 0 0
來說,h[]為別為
1 0 1 0 1
2 1 2 1 2
3 2 2 2 0
0 3 4 3 1
1 0 5 4 2
對每一列的h[]值可以更新左右邊界l[],r[]
初始l[j],r[j]都設(shè)為j,可以看出,如果h[j]<=h[l[j]-1],那么l[j]=l[l[j]-1].相應(yīng)的,如果h[j]<=h[r[j]+1],則r[j]=r[r[j]+1].
則對每一行的記錄的h[]和l,r邊界可以計算出從以第i行為結(jié)尾的最大面積Si=h[j]*(r[j]-l[j]+1)|1<=j<=n
最后,取這個面積的最大值。
CODE