您的位置:首页 > Web前端 > AngularJS

USACO 6.1.2 A Rectangular Barn

2012-08-18 13:09 232 查看
题目大意:

给出r*c的矩阵中p个障碍点的位置,求能放置矩形的最大面积。

简单题解:
令h[i][j]表示(i,j)到竖直向上的最近障碍点(或顶端)的线段的长度,left[i][j]、right[i][j]分别表示该线段向左、右延伸的长度。则max{h[i][j]*(left[i][j]+right[i][j]-1)}即为答案。
使用动态规划求h[i][j]、left[i][j]、right[i][j]。

我的代码:

/*
ID:t-x.h1
LANG:C++
TASK:rectbarn
*/
#include<cstdio>
#define up(x,y) if((y)>(x)) (x)=(y)
FILE *fi=fopen("rectbarn.in","r"),*fo=fopen("rectbarn.out","w");
const int MAXn=3000+9,INF=99999999;
bool map[MAXn][MAXn];
int left[MAXn],right[MAXn],h[MAXn];
inline int min(int a,int b)
{
return a?(a<b?a:b):b;
}
int main()
{
int r,c,p,i,j,k,ans=0;
fscanf(fi,"%d%d%d",&r,&c,&p);
for(i=1;i<=p;++i)
{
fscanf(fi,"%d%d",&j,&k);
map[j][k]=1;
}
for(i=1;i<=r;++i)
{
for(k=0,j=1;j<=c;++j)
if(map[i][j])
h[j]=0,left[j]=k=0;
else
++h[j],left[j]=min(left[j],++k);
for(k=0,j=c;j;--j)
{
right[j]=map[i][j]?k=0:min(right[j],++k);
up(ans,h[j]*(left[j]+right[j]-1));
}
}
fprintf(fo,"%d\n",ans);
fclose(fi);
fclose(fo);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: