題目描述
給定乙個01矩陣,找出乙個面積最大的子矩陣,使得其中的元素均為1。輸出這個最大面積乘3。
輸入第一行兩個整數n,m,表示矩形土地有n行m列。
接下來n行,每行m個用空格隔開的字元'f'或'r',描述了矩形土地。
輸出輸出乙個整數,表示你能得到多少銀子,即(3*最大'f'矩形土地面積)的值。
樣例輸入
5 6r f f f f f
f f f f f f
r r r f f f
f f f f f f
f f f f f f
樣例輸出
45題解
單調棧考慮最暴力的做法:列舉矩形左上右下的點,判斷是否均為1。
好一點的暴力做法:列舉矩形下方的兩個點(這個過程只需要列舉3個座標),然後再找最大能夠向上延伸多高。容易預處理出每個位置向上最多延伸多高,那麼要求的就是這兩個點直接所有點(包括這兩個點)的延伸高度的最小值。
對於區間最小值作貢獻問題,乙個常用的套路是列舉最小值,考慮貢獻。那麼可以使用單調棧處理出乙個數左邊第乙個小於它的位置和右邊第乙個小於它的位置。這兩個位置之間的都大於它,此時這個數作為最小值,最大寬度為位置差,直接計算貢獻即可。
時間複雜度$o(nm)$。
#include #include #include #define n 1010using namespace std;
int a[n][n] , sta[n] , tot , lp[n] , rp[n];
char str[5];
int main()
tot = 0 , sta[0] = 0;
for(j = 1 ; j <= m ; j ++ )
tot = 0 , sta[tot] = m + 1;
for(j = m ; j ; j -- )
for(j = 1 ; j <= m ; j ++ ) ans = max(ans , a[i][j] * (rp[j] - lp[j] - 1));
} printf("%d\n" , ans * 3);
return 0;
}
BZOJ 3039 玉蟾宮(DP 單調棧)
每次看到我的提交都有點淡淡的憂傷t t。看到此題我想到用字首和維護點ij向左和向上能拓展的最大長度,然後設狀態f i,j,0 表示ij這個點為最大矩形的右下角時的長 橫的 f i,j,1 表示ij這個店為最大矩形右下角時的寬 豎的 然後決策就是取點 i 1,j 1 的f值拓展一層為ij的,找到乙個可...
BZOJ3039 玉蟾宮(懸線dp 單調棧)
description 有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。這片土地被分成n m個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。現在freda要在這裡賣...
刷題總結 玉蟾宮(bzoj3039單調棧)
有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。這片土地被分成n m個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。現在freda要在這裡賣萌。它要找一塊矩形土地,...