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 }

 

转载于:https://www.cnblogs.com/txhwind/archive/2012/08/18/2645370.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值