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
source
poetize4
思路:記錄每個點最高能到達的懸線,然後對這個懸線向左向右平移得到極大子矩陣。列舉每個所以豎直懸線,就能得到所有極大子矩陣,取最大即可。
單調棧:先預處理出高度,然後在每一行上維護長度,這就成了經典的柱形圖最大矩陣問題了。
**用極大化思想解決最大子矩形問題–王知昆:
acnew
#include
#include
#include
using
namespace std;
const
int maxn =
1005
;int a[maxn]
[maxn]
,left[maxn]
[maxn]
,right[maxn]
[maxn]
,up[maxn]
[maxn]
;int
main()
}int ans =0;
for(
int i =
1;i <= n;i++
)else
}for
(int j = m;j >=
1;j--
)else}}
printf
("%d\n"
,ans *3)
;return0;
}
#include
#include
#include
using
namespace std;
int maze[
1005][
1005];
int rightt[
1005][
1005
], leftt[
1005][
1005
],up[
1005][
1005];
intmain()
}int ans =0;
for(
int i =
1;i <= n;i++
)else
}for
(int j = m;j >=
1;j--
)else}}
printf
("%d\n"
,ans *3)
;return0;
}
單調棧寫法
#include
#include
#include
using
namespace std;
const
int maxn =
1007
;struct node
stk[maxn]
;int a[maxn]
[maxn]
,h[maxn]
[maxn]
;int
main()
}for
(int i = n;i >=
1;i--)}
}int ans =0;
for(
int i =
1;i <= n;i++
) stk[
++top]
.h = h[i]
[j];stk[top]
.d = d +1;
}int d =0;
while
(top)
}printf
("%d\n"
,ans *3)
;return0;
}
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...
BZOJ 3039 玉蟾宮(DP 單調棧)
每次看到我的提交都有點淡淡的憂傷t t。看到此題我想到用字首和維護點ij向左和向上能拓展的最大長度,然後設狀態f i,j,0 表示ij這個點為最大矩形的右下角時的長 橫的 f i,j,1 表示ij這個店為最大矩形右下角時的寬 豎的 然後決策就是取點 i 1,j 1 的f值拓展一層為ij的,找到乙個可...