刷題總結 玉蟾宮(bzoj3039單調棧)

2022-05-23 13:24:15 字數 1408 閱讀 7765

有一天,小貓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'矩形土地面積)的值。

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對於50%的資料,1<=n,m<=200

對於100%的資料,1<=n,m<=1000

poetize4

首先列舉每一行,再列舉每一列算向上的最大高度····

至於寬度利用從左到右,從右到左兩次單調棧列舉第一次小於該列高度的列的位置x,則x+1(x-1)要麼是這一列,要麼是第乙個大於這一列的列(且x+1(x-1)到列舉的列的高度都大於等與列舉的這一列),從而算出矩形的最大值

#include#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=1005

;int map[n][n],stack[n],tail,n,m,height[n],left[n],right[n],ans=0

;char

c;int

main()

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

tail=0

; stack[

0]=0

;

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

tail=0

; stack[

0]=m+1

;

for(int j=m;j>=1;j--)

for(int j=1;j<=m;j++) ans=max(ans,height[j]*(right[j]-left[j]+1

)); }

cout

<3

}

bzoj3039 玉蟾宮 單調棧

題目描述 給定乙個01矩陣,找出乙個面積最大的子矩陣,使得其中的元素均為1。輸出這個最大面積乘3。輸入第一行兩個整數n,m,表示矩形土地有n行m列。接下來n行,每行m個用空格隔開的字元 f 或 r 描述了矩形土地。輸出輸出乙個整數,表示你能得到多少銀子,即 3 最大 f 矩形土地面積 的值。樣例輸入...

BZOJ 3039 玉蟾宮 懸線法

題目大意 給出一張地圖,求出這張地圖中最大的子矩陣,使得這個子矩陣不包含字母 r 思路 簡單的懸線法求最大子矩陣,還是不帶權值的,很好求。好久沒寫懸線了,複習一下。code include include include include define max 1010 using namespace...

BZOJ 3039 玉蟾宮(DP 單調棧)

每次看到我的提交都有點淡淡的憂傷t t。看到此題我想到用字首和維護點ij向左和向上能拓展的最大長度,然後設狀態f i,j,0 表示ij這個點為最大矩形的右下角時的長 橫的 f i,j,1 表示ij這個店為最大矩形右下角時的寬 豎的 然後決策就是取點 i 1,j 1 的f值拓展一層為ij的,找到乙個可...