码迷,mamicode.com
首页 > 其他好文 > 详细

最大1矩阵

时间:2016-03-21 19:46:33      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

这个算是模板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;
}
View Code

 

最大1矩阵

标签:

原文地址:http://www.cnblogs.com/zsyacm666666/p/5303009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!