HDU 1505 City Game【矩阵的最大面积】
Each area has its width and length. The area is divided into a grid of equal square units.The rent paid for each unit on which you're building stands is 3$.
Your task is to help Bob solve this problem. The whole city is divided into K areas. Each one of the areas is rectangular and has a different grid size with its own length M and width N.The existing occupied units are marked with the symbol R. The unoccupied units are marked with the symbol F.
R – reserved unit
F – free unit
In the end of each area description there is a separating line.
思路 |
方法:子矩阵1的加强版,将一维的状态转换为二维的状态,即再上一基础上加以个for循环,并且R置为F时置为在前行的基础上+1,求出最大面积。 |
源码 |
#include<string.h> #include<stdio.h> int f[1003][1003], left[1003], right[1003]; int main() { int m, n, i, j, k, T, t; scanf("%d", &T); char ch[5]; while(T--) { scanf("%d%d", &m, &n); //getchar(); memset(f, 0, sizeof(f)); for(i=1; i<=m; i++) for(j=1; j<=n; j++) { scanf("%s", ch); if(ch[0]=='F') f[i][j]=1+f[i-1][j]; } int area=0; for(k=1; k<=m; k++) { for(i=1; i<=n; i++) { left[i]=right[i]=i; } for(i=2; i<=n; i++) { int temp=i; while(f[k][temp-1]>=f[k][i]&&temp>1) temp=left[temp-1]; left[i]=temp; } for(i=n-1; i>0; i--) { int temp=i; while(f[k][temp+1]>=f[k][i]&&temp<n) temp=right[temp+1]; right[i]=temp; } for(i=1; i<=n; i++) { if((right[i]-left[i]+1)*f[k][i]>area) area=(right[i]-left[i]+1)*f[k][i]; } } printf("%d\n", area*3); getchar(); } }
|