LA3029

xiaoxiao2021-02-28  72

/* 这道题解题分成两步 第一步是计算每个空格向上延伸多远,也就是计算每个单元格的高度 然后是计算一行单元格中所有单元格组成的高低不一的一维数组的最大矩形面积 对于第二个问题,这中间使用了动态规划 面积最大的矩形肯定是以矩形边界的边为高,这个高度能够向右滑动的最大距离为宽形成的。 从右向左扫描,因此是动态规划方程为: end=i+1 while(end<n&&high[end]>=high[i])end+=len[end]; len[i]=end-i; */ #include<cstdio> #include<iostream> #include<algorithm> #include<stdio.h> #include<vector> #include<utility> #include<unordered_set> using namespace std; //auto fin=fopen("UVa.in","r"); const int nmax=1000+5; int h[nmax][nmax]; int len[nmax]; inline int cal(int m,int n){ int ans=0; for(int i=n-1;i>=0;--i){ int end=i+1; while(end<n&&h[m][end]>=h[m][i])end+=len[end]; len[i]=end-i; } for(int i=0;i<n;++i)ans=max(ans,len[i]*h[m][i]); return ans; } int main() { int T=0,m,n,ch; scanf("%d",&T); while(T--){ scanf("%d %d",&m,&n); for(int i=0;i<m;++i){ for(int j=0;j<n;++j){ ch=getchar(); while(ch!='F'&&ch!='R')ch=getchar(); h[i][j]=ch=='F'?1:0; } } for(int i=1;i<m;++i){ for(int j=0;j<n;++j)h[i][j]=h[i][j]==0?0:h[i-1][j]+1; } int ans=0; for(int i=0;i<m;++i)ans=max(ans,cal(i,n)); printf("%d\n",ans*3); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-96682.html

最新回复(0)