hdu 1505 (求一個最大的空閒矩形的面積)
阿新 • • 發佈:2019-01-26
剛開始一點想法都沒有,可以用把每一行分開來分析,對於每一行的每一列來說,它都有一個以這一行為水平線上的連續深度,我們當成它的a陣列,然後相當於1506的情況了。直接L,R陣列記錄。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e3 + 10; typedef long long ll; #define clr(x,y) memset(x,y,sizeof x) #define INF 0x3f3f3f3f int maze[maxn][maxn]; int a[maxn],L[maxn],R[maxn]; int dp[maxn][maxn]; int main() { int Tcase;scanf("%d",&Tcase); while(Tcase --) { int n,m;scanf("%d%d",&n,&m); for(int i = 1;i <= n;i ++) { for(int j = 1;j <= m;j ++) { char s[2];scanf("%s",s); maze[i][j] = s[0] == 'F' ? 1 : 0; } } clr(dp,0); int ans = 0; for(int i = 1;i <= n;i ++) { for(int j = 1;j <= m;j ++) { if(maze[i][j])dp[i][j] = dp[i - 1][j] + 1; a[j] = dp[i][j]; L[j] = R[j] = j; } a[0] = a[m + 1] = -1; for(int j = 1; j <= m;j ++) { while(a[L[j] - 1] >= a[j]) { L[j] = L[L[j] - 1]; } } for(int j = m;j >= 1;j --) { while(a[R[j] + 1] >= a[j]) R[j] = R[R[j] + 1]; } for(int j = 1;j <= m;j ++) { ans = max(ans,(R[j] - L[j] + 1) * a[j]); } } printf("%d\n",ans * 3); } return 0; }