给n*m的地图,只有R/F,求最大的F矩形面积(就是个数),输出答案*3
n,m<=1000
看到三秒。。。大胆尝试一下跑n^3。。。。结果居然在uva卡过了。。2s...
先n^2预处理一下,给这个n*m矩阵涂色:
初始化计数器cnt=0
第一个如果是F,涂颜色++cnt,然后往后遍历,如果是R跳过,如果是F,看和前面一个位置是否也是F,是的话,涂和上一个位置一样的颜色,否则涂新的颜色(++cnt)
这样处理完之后。对于第k行,我们要判断i到j列是否全是F,只需要判断 col[k][i]==col[k][j](当然不能是零)
因此我们m^2枚举最优矩形所在的列数i,j, 然后每一次枚举 用o(n) 找出最优矩形所在的行数,便是答案
uvaLA的题非常坑。。。这题读入用scanf(“%c”)会wa。。估计有多余的空格之类的。。。该成%s就ac 了。。。
发现n^3在uva是2s卡过,在poj是tle。。估计是加强数据了
n^2的解法(dp)和 http://blog.youkuaiyun.com/viphong/article/details/47985285 这题类似,该题是求 一维上的最大面积,本题是二维,
我们用up[i][j]表示第i行第j列 这个空格 能往上延伸的最大长度(包括自身)
ll[i][j]表示向左延伸最大长度,rr【i】【j】同理,我们可以n^2得到这三个数组
然后我们n^2枚举每一个格子,更新答案即可,
int ret=up[i][j]*(1+ll[i][j]+rr[i][j]);
if (ret>maxx)
maxx=ret;
dp n^2:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
char mp[1005][1005];
int up[1005][1005];
int ll[1005][1005];
int rr[1005][1005];
int main()
{
int n,s;
int t;
cin>>t;
while(t--)
{
memset(up,0,sizeof(up));
memset(ll,0,sizeof(ll));
memset(rr,0,sizeof(rr));
int n,m;
int i,j,k;
cin>>n>>m;
getchar();
char sss[10];
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
scanf("%s",sss);
mp[i][j]=sss[0];
}
}
for (i=n;i>=1;i--)
{
for (j=1;j<=m;j++)
{
if (mp[i][j]=='F')
up[i][j]=up[i+1][j]+1;
else
up[i][j]=0;
}
}
for (i=n;i>=1;i--)
{
for (j=2;j<=m;j++)
{
if (up[i][j]<=up[i][j-1])
ll[i][j]=ll[i][j-1]+1;
else
ll[i][j]=0;
}
}
for (i=n;i>=1;i--)
{
for (j=m-1;j>=1;j--)
{
if (up[i][j]<=up[i][j+1])
rr[i][j]=rr[i][j+1]+1;
else
rr[i][j]=0;
}
}
int maxx=0;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
int ret=up[i][j]*(1+ll[i][j]+rr[i][j]);
if (ret>maxx)
maxx=ret;
}
}
printf("%d\n",maxx*3);
}
return 0;
}
n^3算法:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
char mp[1005][1005];
int col[1005][1005];
int main()
{
int n,s;
int t;
cin>>t;
while(t--)
{
memset(col,0,sizeof(col));
int n,m;
int i,j,k;
cin>>n>>m;
getchar();
char sss[10];
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
scanf("%s",sss);
mp[i][j]=sss[0];
}
}
int cnt=0;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
if (mp[i][j]=='R') continue;
if (j==1)
col[i][j]=++cnt;
if (mp[i][j]==mp[i][j-1])
col[i][j]=col[i][j-1];
else
col[i][j]=++cnt;
}
}
int maxx=0;
for (i=1;i<=m;i++)
{
for (j=i;j<=m;j++)
{
int tmp=0;
for (k=1;k<=n;k++)
{
if (!col[k][i]||!col[k][j])
{tmp=0;continue;}
if (col[k][i]==col[k][j])
{
tmp+=(j-i+1);
if (tmp>maxx)
maxx=tmp;
}
else
tmp=0;
}
}
}
printf("%d\n",maxx*3);
}
return 0;
}