1159 最大全0子矩陣

2022-05-01 10:27:06 字數 1466 閱讀 7067

/*

f(i,j)表示以(i,j)為右下角的最大全0子矩陣的邊長

若a[i][j]==1,f(i,j)=0

否則:f(i,j)=min+1

這樣求得的是最大全0正方形子矩陣

要求長方形矩陣,上述思路行不通

假設以(i,j)為右下角的最大矩陣=12

它可能是3*4、4*3、2*6、6*2、1*12、12*1

按上述思路進行狀態轉移的話,取得最優值的方案不唯一時,

所有的方案需要都記下,用於後續的狀態轉移。

在長方形全0子矩陣中,考察某個位置(i,j)

在第i行中,包含(i,j)位置的全0區間長度》=長方形的寬

若第i行是子矩陣的最後一行,由(i,j)位置向上,連續0的個數》=長方形的高

設[l(i,j)..r(i,j)]是第i行上包含(i,j)的全0子區間

第i1行到第i2行且包含(i2,j)的子矩陣需滿足的條件:

(i1..i2,j)均為0,i2-i1+1=矩陣的高

(i,j)對應的區間[l(i,j)..r(i,j)]>=矩陣的寬

孤立地計算l(i,j)、r(i,j),再列舉i1,i2,j,時間複雜度o(n^3)

l(i,j)與l(i,j-1),r(i,j)與r(i,j+1)之間有關係;

定義h(i,j)表示位置(i,j)向上連續0的個數,h(i,j)與h(i-1,j)之間有關係;

矩形的寬取決於[i1..i2]行中第j列上[l(i,j)..r(i,j)]的最小值

定義l(i,j),r(i,j)分別表示截止到第i行,之前的h(i,j)行中,全0元素的左右區間,

那麼子矩陣的大小=(r(i,j)-l(i,j)+1)*h(i,j)

h(i,j)的遞推關係

if(a[i][j]==0) h(i,j)=h(i,j)+1;

else h(i,j)=0;

l(i,j)的遞推關係

定義mx表示之前0出現的左側位置,初始值=1

if(a[i][j]==0)else

r(i,j)的遞推關係

定義mn表示之前0出現的右側位置,初始值=n

if(a[i][j]==0)else

其中l(i,j),r(i,j),h(i,j)都可以壓縮成一維陣列。 

*/

1 #include 2 #include 3

using

namespace

std;

4const

int maxn=2010;5

intn,a[maxn],l[maxn],r[maxn],h[maxn];

6int

mx,mn,ans;

7int

main()829

for(int col=n;col>0;col--)

3039

}40 printf("

%d\n

",ans);

41return0;

42 }

codevs 1159 最大全0子矩陣

時間限制 1 s 空間限制 128000 kb 題目描述 description 在乙個0,1方陣中找出其中最大的全0子矩陣,所謂最大是指o的個數最多。輸入描述 input description 輸入檔案第一行為整數n,其中1 n 2000,為方陣的大小,緊接著n行每行均有n個0或1,相鄰兩數間嚴...

codevs1159 最大全0子矩陣

題目描述 description 在乙個0,1方陣中找出其中最大的全0子矩陣,所謂最大是指o的個數最多。輸入描述 input description 輸入檔案第一行為整數n,其中1 n 2000,為方陣的大小,緊接著n行每行均有n個0或1,相鄰兩數間嚴格用乙個空格隔開。輸出描述 output des...

CODEVS1159 最大全0子矩陣解題報告

題目描述 description 在乙個0,1方陣中找出其中最大的全0子矩陣,所謂最大是指o的個數最多。輸入描述 input description 輸入檔案第一行為整數n,其中1 n 2000,為方陣的大小,緊接著n行每行均有n個0或1,相鄰兩數間嚴格用乙個空格隔開。輸出描述 output des...