題目描述:
在乙個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
04思路:
剛開始看這道題時,想到的是用求最大子矩陣的和的方法,不過該演算法的複雜度是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 34view codeintm, 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 }
九度 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...