背景 Background
有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
描述 Description
这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着'F'并且面积最大。
但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。
输入格式 Input Format
第一行两个整数N,M,表示矩形土地有N行M列。
接下来N行,每行M个用空格隔开的字符'F'或'R',描述了矩形土地。
输出格式 Output Format
输出一个整数,表示你能得到多少银子,即(3*最大'F'矩形土地面积)的值。
样例输入 Sample Input [复制数据]
样例输出 Sample Output [复制数据]
时间限制 Time Limitation
各个测试点1s
注释 Hint
对于50%的数据,1<=N,M<=200
有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
描述 Description
这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着'F'并且面积最大。
但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。
输入格式 Input Format
第一行两个整数N,M,表示矩形土地有N行M列。
接下来N行,每行M个用空格隔开的字符'F'或'R',描述了矩形土地。
输出格式 Output Format
输出一个整数,表示你能得到多少银子,即(3*最大'F'矩形土地面积)的值。
样例输入 Sample Input [复制数据]
样例输出 Sample Output [复制数据]
时间限制 Time Limitation
各个测试点1s
注释 Hint
对于50%的数据,1<=N,M<=200
对于100%的数据,1<=N,M<=1000
开始以为与usaco上的题目类似。
后来一看发现是矩形而不是正方形。。
于是就不会了。。。。。。
然后看了题解。写了这题。
学习了一种叫做单调栈的东西。。
官方题解地址http://hi.baidu.com/lydrainbowcat/item/a9759603f6d6a9e3fe240dc5
var i,j,n,m,ans:longint;
s,l,h:array[0..1000]of longint;
f:array[0..1000,0..1000]of longint;
ch:char;
procedure work(k:longint);
var i,j,top,len,max:longint;
begin
for i:=1 to m do h[i]:=f[k,i];
fillchar(s,sizeof(s),0);
for i:=1 to m do l[i]:=0;
top:=0;s[top]:=0;l[top]:=0;max:=0;
for i:=1 to m do
begin
if h[i]>=s[top] then
begin
inc(top);
s[top]:=h[i];
l[top]:=1;
end
else
begin
len:=0;
while (top>0)and(s[top]>h[i]) do
begin
len:=len+l[top];
if max<len*s[top] then max:=len*s[top];
dec(top);
end;
inc(top);
s[top]:=h[i];
l[top]:=len+1;
end;
end;
len:=0;
while (top>0) do
begin
len:=len+l[top];
if max<len*s[top] then max:=len*s[top];
dec(top);
end;
if ans<max then ans:=max;
end;
begin
fillchar(f,sizeof(f),0);
readln(n,m);
for i:=1 to n do
for j:=1 to m do
begin
repeat read(ch);
until (ch='F')or(ch='R');
if ch='F' then f[i,j]:=f[i-1,j]+1
else f[i,j]:=0;
end;
ans:=0;
for i:=1 to n do
work(i);
writeln(3*ans);
readln;readln;
end.