有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。
這片土地被分成n*m個格仔,每個格仔裡寫著'r'或者'f',r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。
現在freda要在這裡賣萌。。。它要找一塊矩形土地,要求這片土地都標著'f'並且面積最大。
但是rainbow和freda的oi水平都弱爆了,找不出這塊土地,而藍兔也想看freda賣萌(她顯然是不會程式設計的……),所以它們決定,如果你找到的土地面積為s,它們每人給你s兩銀子。
輸入格式:
第一行兩個整數n,m,表示矩形土地有n行m列。
接下來n行,每行m個用空格隔開的字元'f'或'r',描述了矩形土地。
輸出格式:
輸出乙個整數,表示你能得到多少銀子,即(3*最大'f'矩形土地面積)的值。
輸入樣例#1:
5 6輸出樣例#1:r 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這是一道非常經典的題目。看到學長們個個都用懸線法來做,無奈本蒟蒻水平過低,只會用單調棧來切這道題。
我們可以把f看做1,r看做0。
來看下面這個矩陣:
看起來這道題似乎無從下手,但是如果我們把每一列1的連續和求出來,像這樣:
也許我們仍然沒能發現什麼規律,但是不要緊,我們接著看:
我們嘗試以每一行作為這個矩形的底邊,找出圖中最大的矩形,也就是圖中的染色部分,有沒有想起點什麼?
這不就是poj 2559 largest rectangle in a histogram 這道題嗎?這樣我們的思路也就得出了,我們可以先對讀入的資料預處理一下,統計每一列的連續和,然後對每一行維護乙個單調棧,求出以每一行為底的最大矩陣的大小,最後取最大值。
1 #include2 #include3 #includeview code4 #include5 #include6 #include7 #include8 #include9 #include10
#define maxn 1005
11using
namespace
std;
1213 stacks;
1415 inline int
read()
1625
while(c>='
0'&&c<='9'
)2630return x*res;31}
3233
long
long
ans;
34int
n,m,a[maxn],w[maxn];
35int
ju[maxn][maxn];
36char
aa;37
38int
main()
3950
if(aa=='r'
)5154}
55}56for(int j=1;j<=m;j++)
5764
else
6568}69
}70for(int i=1;i<=n;i++)
7176 a[1+m]=0;77
while
(s.size()) s.pop();
78for(int j=1;j<=m+1;j++)
7985
else
8694
s.push(a[j]);
95 w[s.size()]=mi+1;96
}97}98
}99 printf("
%lld\n
",ans*3
);100
return0;
101 }
P4147 玉蟾宮 單調棧
有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。這片土地被分成n m個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。現在freda要在這裡賣萌。它要找一塊矩形土地,...
玉蟾宮 洛谷P4147
題目描述 有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。這片土地被分成nm個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。現在freda要在這裡賣萌。它要找一塊矩...
洛谷P4147 玉蟾宮
傳送門給定乙個 n m 的 0 1 矩陣,求最大子矩陣 滿足矩陣內所有元素均為 1 輸出矩陣大小 3 懸線法,最大子矩陣板子題 也可以單調棧和並查集,但是窩不會 維護三個值 l i j 和 r i j up i j 分別代表當前點 i,j 向左最長的延伸到的點位置,向右最長的延伸到的點位置,向上最長...