玉蟾宮(單調棧 懸線法) codevs 2491

2021-08-07 02:36:37 字數 1637 閱讀 8058

題目描述 description

輸入描述 input description

輸出描述 output description

樣例輸入 sample input

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

樣例輸出 sample output
45
資料範圍及提示 data size & hint

對於50%的資料,1<=n,m<=200

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

because codevs 資料太水 ,可以n^3 水過。

所以…n^3

對於每個點處理這個點往上有多少個f(相當於統計乙個豎直方向上f的字首和),

再列舉每一行,同時列舉這一行上f矩形可能達到的寬度(豎直方向),

並用在當前寬度下所能延伸到的最大長度(水平方向)來統計f矩形的面積並更新答案。

(長,寬可以唯一的確定乙個矩形)

**

#include

#include

#include

using

namespace

std;

int n,m,ans,sum;

int a[1010][1010];

int main()

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

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

}printf("%d",ans*3);

return

0;}

n^2

單調棧+懸線法

對於每個點,處理從這個點向上有多少個連續的f,也可看作為高度,對於每一行,轉化為一維上求最大矩形面積的問題。

我們選擇用單調棧來維護並更新答案。

* 小科普:單調棧就是其中元素單增或單減的棧(不一定嚴格),以單增的棧為例,對於新元素x,我們比較x與當前棧頂元素的大小,若x大於(等於)當前棧頂元素,則入棧,不然就彈棧,直至x滿足條件入棧為止。

對於當前矩形x,若h[x]>=stack[top].h,則入棧,否則就彈棧,同時計算當前矩形的值並更新答案。所有矩形都入過棧後,若棧沒有空,就重複之前彈棧的操作。

**

#include

#include

#include

using

namespace

std;

int n,m,ans,len,top;

int f[1010][1010];

char c;

struct maplestack[1010];

int main()

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

stack[++top]=((maple));

}len=0;

while(top)

}printf("%d",ans*3);

return

0;}

BZOJ3039 玉蟾宮(懸線dp 單調棧)

description 有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。這片土地被分成n m個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。現在freda要在這裡賣...

BZOJ 3039 玉蟾宮 懸線法

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

BZOJ 3039 玉蟾宮 懸線法

最大子矩陣.懸線法.時間複雜度o nm 懸線法就是記錄乙個h向上延伸的最大長度 懸線 l,r向左向右延伸的最大長度,然後通過遞推來得到.include using namespace std define ok c c f c r const int maxn 1009 int h maxn max...