2491 玉蟾宫
时间限制: 1 s
空间限制: 64000 KB
题目等级 : 大师 Master
题目描述 Description
有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着'F'并且面积最大。
但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。
输入描述
Input Description
第一行两个整数N,M,表示矩形土地有N行M列。
接下来N行,每行M个用空格隔开的字符'F'或'R',描述了矩形土地。
输出描述
Output Description
输出一个整数,表示你能得到多少银子,即(3*最大'F'矩形土地面积)的值。
样例输入
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
来源:Nescafe 20
首先,这是2003ioi集训队论文 王知昆,讲了用极大化思想解决最大子矩形问题 https://wenku.baidu.com/view/a97d0b1c59eef8c75fbfb31b.html
具体思路都在里边了;
开始用深搜做了半个小时,我去;
以下为ac代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define n 1001 6 #define m 1001 7 int in,me,h[m],l[m],r[m],ans; 8 bool o[n][m]; 9 int main() 10 { 11 char ch[1]; 12 scanf("%d%d",&in,&me); 13 for(int i=1;i<=in;i++) 14 for(int j=1;j<=me;j++) 15 { 16 scanf("%s",ch) 17 map[i][j]=(ch[0]=='F')?0:1; 18 } 19 for(int j=1;j<=me;j++) 20 { 21 h[j]=0;l[j]=1;r[j]=me; 22 } 23 for(int i=1,lo,ro;i<=in;i++) 24 { 25 lo=0;ro=me+1; 26 for(int j=1;j<=me;j++) 27 { 28 if(o[i][j]) 29 { 30 h[j]=0; 31 l[j]=1; 32 lo=j; 33 } 34 else 35 { 36 h[j]++; 37 l[j]=max(l[j],lo+1); 38 } 39 } 40 for(int j=me;j;j--) 41 { 42 43 if(o[i][j]) 44 { 45 r[j]=me; 46 ro=j; 47 } 48 else 49 { 50 r[j]=min(r[j],ro-1); 51 ans=max(ans,h[j]*(r[j]-l[j]+1)); 52 } 53 } 54 } 55 printf("%d",3*ans); 56 return 0; 57 }