USACO 6.1.2 A Rectangular Barn

题目大意:

给出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]。
 
我的代码:
 1 /*
 2 ID:t-x.h1
 3 LANG:C++
 4 TASK:rectbarn
 5 */
 6 #include<cstdio>
 7 #define up(x,y) if((y)>(x)) (x)=(y)
 8 FILE *fi=fopen("rectbarn.in","r"),*fo=fopen("rectbarn.out","w");
 9 const int MAXn=3000+9,INF=99999999;
10 bool map[MAXn][MAXn];
11 int left[MAXn],right[MAXn],h[MAXn];
12 inline int min(int a,int b)
13 {
14         return a?(a<b?a:b):b;
15 }
16 int main()
17 {
18         int r,c,p,i,j,k,ans=0;        
19         fscanf(fi,"%d%d%d",&r,&c,&p);
20         for(i=1;i<=p;++i)
21         {
22                 fscanf(fi,"%d%d",&j,&k);
23                 map[j][k]=1;
24         }
25         for(i=1;i<=r;++i)
26         {
27                 for(k=0,j=1;j<=c;++j)
28                         if(map[i][j])
29                                 h[j]=0,left[j]=k=0;
30                         else
31                                 ++h[j],left[j]=min(left[j],++k);
32                 for(k=0,j=c;j;--j)
33                 {
34                         right[j]=map[i][j]?k=0:min(right[j],++k);
35                         up(ans,h[j]*(left[j]+right[j]-1));
36                 }
37         }
38         fprintf(fo,"%d\n",ans);
39         fclose(fi);
40         fclose(fo);
41         return 0;
42 }

 

posted @ 2012-08-18 13:09  凌云七风  阅读(192)  评论(0编辑  收藏  举报