51nod 1158 全是1的最大子矩陣

2022-04-30 01:09:17 字數 1106 閱讀 7535

題目鏈結在這兒

如果我的部落格費解,可以看這篇部落格,認為清晰。

首先把子矩陣預處理,g[i][j]表示第[i][j]號元素能向左延伸的長度。

進而針對每一列,假設是c列,考慮g[i][c],i∈[1, row],得到g[i][c]元素在這一列上作為作為最小值的長度。

假設這個區間是(u, d),那麼長度為d-u-1,那麼臨時解為(d-u-1)*g[i][j]。取臨時解中的最大值即為答案。

這裡要利用單調棧,或者用我用的比較簡潔的寫法都ok,理解了解法自己寫比較好,複雜度o(n^2)。

為何是這樣:舉個例子,假設有下面描述的第5列左連續的值為2 4 3 5 2:

考慮第三行第五列的值3,在這列上它作為最小值的開區間是(1, 5),閉區間是[2, 4],乙個解即為(5-1-1)*3=9。

對**的解釋:u[i]和d[i]分別表示列上某一元素i,作為最小值能覆蓋的左開區間點up和右開區間點down。

#include #include 

using

namespace

std;

const

int maxn=5e2+5

;int

n, m, k, t;

intg[maxn][maxn], u[maxn], d[maxn];

intmain()

}int ans = 0

;

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

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

while (u[r] && g[u[r]][c] >=g[r][c])

u[r] =u[u[r]];

for (int r = n; r >= 1; --r)

while (d[r] <= n && g[d[r]][c] >=g[r][c])

d[r] =d[d[r]];

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

ans = max(ans, (d[r] - u[r] - 1) *g[r][c]);

}printf(

"%d\n

", ans);

return0;

}

51Nod 1158 全是1的最大子矩陣

1158 全是1的最大子矩陣 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出1個m n的矩陣m1,裡面的元素只有0或1,找出m1的乙個子矩陣m2,m2中的元素只有1,並且m2的面積是最大的。輸出m2的面積。input 第1行 2個數m,n中間用空格分隔 2 ...

51nod 1158 全是1的最大子矩陣

題目傳送門 題意 給出1個m n的矩陣m1,裡面的元素只有0或1,找出m1的乙個子矩陣m2,m2中的元素只有1,並且m2的面積是最大的。輸出m2的面積。這道題,是一道十分玄學的題目。在題目上方有兩個標籤 單調棧 和 dp 但實際上,這道題根本就不需要單調棧或是dp。因為我不會,所以我只會玄學 首先,...

51nod 1158 全是1的最大子矩陣(單調棧)

思路 與這一題largest rectangle in a histogram很像,只不過本題需要做m次單調棧 因為有m行 先處理出每一行矩形的高度,然後以每一行為底求矩形的面積即可。include using namespace std const int n 1e5 7 int n,m,x,an...