题目
题目描述
Bob爱上了一个策略游戏(Simcity?)游戏中一个城市由k个地区组成,每个地区都是一块长N×宽M大小的网格矩形,其中可能有些网格已被占用,用R表示;有些则是空地,用F表示。
游戏中可以在空着的空间上建一个矩形的建筑,同时每个建筑按它所占的空地网格数来收租,每占用一个网格可收租金3美元。Bob想知道每个地区中最大面积建筑物能收多少租金。
输入格式
第一行是地区个数k。然后接下给出k个地区的相关信息。 相关信息用以下方式输入:
第一行有两个整数n,m (n,m<= 1000),表示这个地区长n宽m
然后接下来有n行,每行m个字符表示网格的信息,相邻的两个用空格隔开。R表示该网格被占用;F表示该网格是空地,可使用。
输出格式
对于每一个地区,输出一行一个整数表示该地区中最大面积建筑物能收到的租金。
注意
POJ dicuss中有人反映数据输出可能不严格按照要求(例如:两个字符间有多个空格),建议使用cin等读入。
感谢@Rye_Catcher 提供的翻译
英文题面
输入样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
3 3 3 R R F F F F F R F 5 6 R F F F F F F R F F F F F F R F F F F F F R F F F F F F R R 4 5 R R R R R R R F R R R R R R R R R F R R |
输出样例
1 2 3 4 |
9 27 3 |
题解
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,ans; int city[1001][1001]; int solve(int r){ int s[1002],len[1002],p=0,ans=0; city[n+1][r]=0; for(int i=1;i<=n+1;i++){ if(city[i][r]>s[p])s[++p]=city[i][r],len[p]=1; else { int lenth=0; while(s[p]>city[i][r]){ lenth+=len[p]; ans=max(ans,lenth*s[p]); p--; } if(city[i][r])s[++p]=city[i][r],len[p]=lenth+1; } } return ans; } int main(){ int t; scanf("%d",&t); while(t--){ ans=0; memset(city,0,sizeof(city)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int last=0; for(int j=1;j<=m;j++){ char op; cin>>op; if(op=='R'){ for(int k=last+1;k<j;k++)city[i][k]=j-k; last=j; } else if(j==m){ for(int k=last+1;k<=j;k++)city[i][k]=j-k+1; } } } for(int i=1;i<=m;i++){ ans=max(ans,solve(i)); } cout<<ans*3<<endl; } return 0; } |