这个算是模板code,以hdu 1505为例题,完全可以将其转化为最大1矩阵问题
#include <stdio.h> #include <iostream> using namespace std; const int N=1111; int a[N][N]; int Run(const int &m, const int &n) { int maxx=0;int k; int col[N]; for(int j=1;j<=n;j++) //探测每列的最长1,遇0则止 { if(a[1][j]==0) col[j]=0; else { for(k=2;k<=m&&a[k][j]==1;++k); col[j]=k-1; } } for(int i=1;i<=m;i++) { if(i>1) { for(int j=1;j<=n;j++) { if(a[i][j]==0) col[j]=0; //倘此处为0,则截至 else { if(a[i-1][j]==0) //上一处为0,则再跑一次探测(探测最长1) { for(k=i+1;k<=m&&a[k][j]==1;++k); col[j]=k-1; } } } } for(int j=1;j<=n;j++) { if(col[j]>=i) //y坐标向下的最长延伸 { int l,r; //凡y坐标向下延伸大于等于第j列的都可以 for(l=j-1;l>=1&&col[l]>=col[j];--l);l++; //向左找 for(r=j+1;j<=n&&col[r]>=col[j];++r);r--; //向右找 int res=(r-l+1)*(col[j]-i+1); //形成了一个矩阵,不要忘了加上自身 maxx=max(res,maxx); } } } return maxx; } int main() { int T; for(scanf("%d",&T); T; T--) { int m,n; char ch; scanf("%d%d",&m,&n); for(int i=1; i<=m; i++) { for(int j=1;j<=n;j++) { cin>>ch; if(ch==‘R‘) a[i][j]=0; else a[i][j]=1; } } int ans=Run(m,n); printf("%d\n",ans*3); } return 0; }
时间: 2024-10-19 00:43:21