傳送門
description
有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。
這片土地被分成n*m個格仔,每個格仔裡寫著』r』或者』f』,r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。
現在freda要在這裡賣萌。。。它要找一塊矩形土地,要求這片土地都標著』f』並且面積最大。
但是rainbow和freda的oi水平都弱爆了,找不出這塊土地,而藍兔也想看freda賣萌(她顯然是不會程式設計的……),所以它們決定,如果你找到的土地面積為s,它們每人給你s兩銀子。
input
第一行兩個整數n,m,表示矩形土地有n行m列。
接下來n行,每行m個用空格隔開的字元』f』或』r』,描述了矩形土地。
output
輸出乙個整數,表示你能得到多少銀子,即(3*最大』f』矩形土地面積)的值。
sample input
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
sample output
45hint
對於50%的資料,1<=n,m<=200
對於100%的資料,1<=n,m<=1000
好像沒有許可權號提交不了這題,不過和黃學長對拍過,應該沒什麼問題吧。
n3 肯定是不行的。
可以 n2 預處理出來每個點上面的 f 的高度,這樣這張圖的每一行就變成了直方圖。
目的就是掃瞄每一行的直方圖,然後計算直方圖中的最大矩陣。
求直方圖的最大矩陣可以用單調棧優化,l[i] 表示在 i 左邊比 i 小的第乙個,r[i] 表示在 i 右邊比 i 小的第乙個。
l 和 r 陣列可以從後往前和從前往後掃兩邊求出來。
最後 ans = max(ans, (r[i] - l[i] - 1) * h[i]) 求出 (h[i] 為高度)
1 #include 2 #include 3view code4using
namespace
std;56
const
int maxn = 1001;7
intn, m, ans, top;
8int
a[maxn][maxn], s[maxn], l[maxn], r[maxn];
910 inline void work(int
h)11
20 top = 0;21
for(i = m; i >= 0; i--)
2226
for(i = 1; i <= m; i++) ans = max(ans, (r[i] - l[i] - 1) *h[i]);27}
2829
intmain()
3039
for(int i = 1; i <= n; i++) work(a[i]);
40 printf("
%d", ans * 3
);41
return0;
42 }
單調棧 城市遊戲(玉蟾宮)
給你 n times m 個格仔,每個格仔上有 r 或 f 現在要找一塊矩形土地,使這片土地都標有 f 且面積最大,讓你求出這個最大面積並 times3 輸出 面積最大,且為矩形,爆搜可以考慮一下,但爆搜肯定是超時的 話說有些題庫 n 3 竟然能過?在爆搜的時候我們能得到的乙個資訊就是,如果以某一高...
單調棧 Poetize4 玉蟾宮
背景 background 有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。描述 description 這片土地被分成n m個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了f...
P4147 玉蟾宮 單調棧
有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。這片土地被分成n m個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。現在freda要在這裡賣萌。它要找一塊矩形土地,...