最大全1子矩陣

2021-09-30 10:45:07 字數 1607 閱讀 6658

給出1個m*n的矩陣m1,裡面的元素只有0或1,找出m1的乙個子矩陣m2,m2中的元素只有1,並且m2的面積是最大的。輸出m2的面積。

input

第1行:2個數m,n中間用空格分隔(2 <= m,n <= 100)

第2 - n + 1行:每行m個數,中間用空格分隔,均為0或1。

output

輸出最大全是1的子矩陣的面積。
input 示例

3 3

1 1 0

1 1 1

0 1 1

output 示例

4
這個題目n=100時可以根據最小子矩陣和求o(n^3),但是當n範圍為1000時,就要求降乙個數量級了。

這裡我們可以一行一行的求。

比如第一行 1 1 0 1 1 1 0 1

那麼我們求和b=

比如第二行為1 1 0 0 0 0 1 1

那麼我們繼續求和b=......

也就是說:

if(map[i][k])

b[k] ++;

else

b[k] = 0;

這樣得到了了乙個直方圖,不知道大家有沒有求過最大直方圖面積的問題

就是不同高度的直方圖,求這個直方圖最大的矩形面積,如何去求?

比如直方圖高度為 1 2 3 2,那麼最大面積是?

當以第乙個為基準的時候高度為1,後面的大於都可以組成矩形,所以面積為4.當以第二個為基準,那麼只有後三個可以,面積為6.同理。。。。最大面積為6.

這裡也是一樣,當求得了第一行到當前行的高度後,可以求出目前的最大面積。

我們設立兩個陣列l,r分別表示以b[j]為基準時候的左右邊界,那麼一b[j]為基準的面積就變成了b[j]*(r[j]-l[j]+1),然後列舉出最大的即可。

對於l,r,我們可以通過下面計算方法獲得:

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

}for (int j = n; j >= 1; -- j)

}

最後可以求最大值:

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

}

#include #include #include using namespace std;

const int maxn = 510;

int map[maxn][maxn];

int b[maxn],l[maxn],r[maxn];

int m,n;

int main()

} for (int j = 0; j <= n+1; ++ j)

for (int i = 1; i <= m; ++ i)

/*for (int j = 1; j <= n; ++ j)

}*/for (int j = 1; j <= n; ++ j)

}for (int j = n; j >= 1; -- j)

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

}} cout << max << endl;

} return 0;

}

最大全1子矩陣

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

poj 3494 dp 最大全1子矩陣

題意 給定乙個n m大小的0 1矩陣,求所有元素都為1的最大子矩陣。思路 把2維轉化為一維 這一點有點像poj1050求最大子矩陣 列舉每一行。dp i j 的值表示第 i,j 個位置作為底,它上面的 包括自己 的連續1的個數。然後通過棧的單調性求每行的 最大值 每行的情況如同poj2559 可以用...

COCI NEO 單調棧求最大全1子矩陣

應該能進 現在有乙個n m的矩陣,定義乙個矩陣 r 2,c 2 是cool的當 a i j a i 1 j 1 a i j 1 a i 1 j 定義乙個矩陣是非常cool的,當所有它的子矩陣 r 2,c 2 是cool的。問你這個矩陣中非常cool 的矩陣最多包含的點的數量是多少。這個題意我搞了好久...