City Game
http://acm.hdu.edu.cn/showproblem.php?pid=1505
Each area has its width and length. The area is divided into a grid of equal square units.The rent paid for each unit on which you're building stands is 3$.
Your task is to help Bob solve this problem. The whole city is divided into K areas. Each one of the areas is rectangular and has a different grid size with its own length M and width N.The existing occupied units are marked with the symbol R. The unoccupied units are marked with the symbol F.
R – reserved unit
F – free unit
In the end of each area description there is a separating line.
2 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 5 5 R R R R R R R R R R R R R R R R R R R R R R R R R
45 0
就是 hdu1506的加强版,在每行求l,r数组就可以了。
hdu1506题解见http://blog.youkuaiyun.com/acm_ted/article/details/7847018
#include<cstdio>
#include<cstring>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
int l[1005],r[1005];
int h[1005];
int main()
{
int cas,n,m,ans;
char s[5],c;
scanf("%d",&cas);
for(; cas--;)
{
ans=0;
memset(h,0,sizeof(h));
scanf("%d%d",&n,&m);
h[0]=h[m+1]=-1;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
scanf("%s",s);//这里的输入比较纠结,要注意输入可能会有多余的回车或者空格
if(s[0]=='F') h[j]++;
else h[j]=0;
}
for(int j=1;j<=m;++j) l[j]=r[j]=j;
for(int j=1;j<=m;++j)
for(;h[l[j]-1]>=h[j];l[j]=l[l[j]-1]);
for(int j=m;j>=1;--j)
for(;h[r[j]+1]>=h[j];r[j]=r[r[j]+1]);
for(int j=1;j<=m;++j)
ans=max(ans,h[j]*(r[j]-l[j]+1));
}
printf("%d\n",ans*3);
}
return 0;
}
来源: http://blog.youkuaiyun.com/ACM_Ted
1万+



被折叠的 条评论
为什么被折叠?



