UVALive

来源:互联网 发布:4g电话软件 编辑:程序博客网 时间:2024/06/05 17:15

题意:给一个'F'和'R'组成的大矩阵,输出F组成的子矩阵的最大面积乘3

如:RFFFRRRR答案书3*3=3

小白书的扫描法小紫书也有扫描法的例题。

我用的模拟,详情见代码注释。

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;char a[1005][1005];int up[1005][1005],right[1005][1005],left[1005][1005];int main(){int t,n,m;scanf("%d",&t);while(t--){memset(up,0,sizeof(up));memset(right,0,sizeof(right));memset(left,0,sizeof(left));scanf("%d %d",&n,&m);for(int i=0;i<n;i++)//这题输入有毒,借鉴了别人的输入方法 。 {for(int j=0;j<m;j++){            char s;            s=getchar();            while(s!='R'&&s!='F')s=getchar();            if(s=='R')a[i][j] = 0;            else a[i][j] = 1;}}for(int i=0;i<n;i++){if(i==0){for(int j=0;j<m;j++){up[i][j]=a[i][j];//第一行up肯定不是1就是0 }}else{for(int j=0;j<m;j++){if(a[i][j]!=0)up[i][j]=up[i-1][j]+1;//看他是不是1如果是则这个点往上最多能到的长度为上的点最多能到的长度+1 else up[i][j]=0;}}}for(int i=0;i<n;i++){int l=0,r=m-1;if(i==0)//第一行特殊处理一下。 {for(int j=0;j<m;j++){if(a[i][j]==1) left[i][j]=l;else l=j+1,left[i][j]=0;//left[i][j]=0这个很重要会影响下面的1 }for(int j=m-1;j>=0;j--){if(a[i][j]==1) right[i][j]=r;else r=j-1,right[i][j]=m-1;//这个也很重要 //printf("%d ",right[i][j]);}}else{for(int j=0;j<m;j++){if(a[i][j]==1) left[i][j]=max(l,left[i-1][j]);//--------------------------   1else l=j+1,left[i][j]=0;}for(int j=m-1;j>=0;j--){if(a[i][j]==1) right[i][j]=min(r,right[i-1][j]);else r=j-1,right[i][j]=m-1;}}}int ans=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){ans=max(ans,up[i][j]*(right[i][j]-left[i][j]+1));//面积为右边-左边结果乘上面能到的 }}printf("%d\n",ans*3);}return 0;}


原创粉丝点击