面積最大的全1子矩陣

2022-07-09 21:57:12 字數 1632 閱讀 5448

題目描述:

在乙個m * n的矩陣中,所有的元素只有0和1,從這個矩陣中找出乙個面積最大的全1子矩陣,所謂最大是指元素1的個數最多。

輸入:

輸入可能包含多個測試樣例。

對於每個測試案例,輸入的第一行是兩個整數m、n(1<=m、n<=1000):代表將要輸入的矩陣的大小。

矩陣共有m行,每行有n個整數,分別是0或1,相鄰兩數之間嚴格用乙個空格隔開。

輸出:

對應每個測試案例,輸出矩陣中面積最大的全1子矩陣的元素個數。

樣例輸入:

2 2

0 00 0

4 40 0 0 0

0 1 1 0

0 1 1 0

0 0 0 0

樣例輸出:

0

4思路:

剛開始看這道題時,想到的是用求最大子矩陣的和的方法,不過該演算法的複雜度是o(n^3),顯然這道題不適合用這個方法。

這題只能用o(n^2)的方法才行。

這時可以一行一行地推,設定乙個h[i]代表從第一行到當前行,第i列的連續0的個數(當前行第i列為0)。設定l,r陣列代表某行高度為》=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]都設為j。對於每一行依次從左到右,如果h[j]<=h[l[j]-1],那麼l[j]=l[l[j]-1].相應的,對於每一行依次從右到左,如果h[j]<=h[r[j]+1],則r[j]=r[r[j]+1].

則對每一行的記錄的h和l,r邊界可以計算出從以第i行為結尾的最大面積si=h[j]*(r[j]-l[j]+1) (1<=j<=n)

最後,取這個面積的最大值。

**如下:

1 #include 2 #include 34

intm, n;

5int

data;

6int h[1005], lw[1005], rw[1005];7

intans;89

int main(void)10

29for (j = 1; j <= n; j ++)

3036

for (j = 1; j <= n; j ++)

37if (h[j] && h[j] * (rw[j] - lw[j] + 1) >ans)

38 ans = h[j] * (rw[j] - lw[j] + 1

);39

}40 printf("

%d\n

", ans);41}

42return0;

43 }

view code

九度 1497 面積最大的全1子矩陣

題目描述 在乙個m n的矩陣中,所有的元素只有0和1,從這個矩陣中找出乙個面積最大的全1子矩陣,所謂最大是指元素1的個數最多 leetcode 原題,沒有案例就是跪,wa 到沒脾氣 未通過九度測試 include include include include include using names...

面積最大的全1子矩陣 九度OJ 1497

題目描述 在乙個m n的矩陣中,所有的元素只有0和1,從這個矩陣中找出乙個面積最大的全1子矩陣,所謂最大是指元素1的個數最多。輸入 輸入可能包含多個測試樣例。對於每個測試案例,輸入的第一行是兩個整數m n 1 m n 1000 代表將要輸入的矩陣的大小。矩陣共有m行,每行有n個整數,分別是0或1,相...

ACM整理(四) 1497面積最大的全1子陣

程式設計思想 本質為計算直方圖中最小長方形面積 設立三個陣列,h,l,r 陣列h i 代表從當前行向上的直方圖的第i列有多少個1,有0間隔即不算 陣列l i 代表大於等於h i 個1的列最小標號為多少 陣列r i 代表大於等於h i 個1的列最大標號為多少 算完這三個陣列之後,迴圈j次 用公式h i...