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 }