P4147 玉蟾宮 單調棧

2022-03-29 20:26:50 字數 2470 閱讀 1060

有一天,小貓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 

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

輸出樣例#1: 

45

這是一道非常經典的題目。看到學長們個個都用懸線法來做,無奈本蒟蒻水平過低,只會用單調棧來切這道題。

我們可以把f看做1,r看做0。

來看下面這個矩陣:

看起來這道題似乎無從下手,但是如果我們把每一列1的連續和求出來,像這樣:

也許我們仍然沒能發現什麼規律,但是不要緊,我們接著看:

我們嘗試以每一行作為這個矩形的底邊,找出圖中最大的矩形,也就是圖中的染色部分,有沒有想起點什麼?

這不就是poj 2559 largest rectangle in a histogram 這道題嗎?這樣我們的思路也就得出了,我們可以先對讀入的資料預處理一下,統計每一列的連續和,然後對每一行維護乙個單調棧,求出以每一行為底的最大矩陣的大小,最後取最大值。

1 #include2 #include3 #include

4 #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 }

view code

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 向左最長的延伸到的點位置,向右最長的延伸到的點位置,向上最長...