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

BZOJ 1057 [ZJOI2007]棋盘制作 最大子矩阵

时间:2015-07-31 13:01:17      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:矩阵   方法   代码   解析   正方形   

题意:链接

方法:最大子矩阵

解析:

这题很水- -

显然最大子正方形是在最大子矩阵之中的,所以没有什么卵区别。极大子矩阵的较小边长即为极大子正方形的边长,最长边长的极大子正方形即为最大子正方形。

然后呢,这题有个小小的区别,就是他要黑白相间的?- -

有什么区别呢?并没有,只需要求le,ri的时候改一下判断就OK了,非常的水。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 2010
using namespace std;
int map[N][N];
int h[N][N];
int le[N][N];
int ri[N][N];
int n,m;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&map[i][j]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(map[i][j-1]==map[i][j])
                le[i][j]=1;
            else le[i][j]=le[i][j-1]+1;
        }
        for(int j=m;j>=1;j--)
        {
            if(map[i][j+1]==map[i][j])
                ri[i][j]=1;
            else ri[i][j]=ri[i][j+1]+1;
        }
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(map[i-1][j]!=map[i][j])
            {
                h[i][j]=h[i-1][j]+1;
                le[i][j]=min(le[i][j],le[i-1][j]);
                ri[i][j]=min(ri[i][j],ri[i-1][j]);
            }
        }
    }
    int ans1=0,ans2=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int tmp=min(h[i][j]+1,le[i][j]+ri[i][j]-1);
            ans1=max(ans1,tmp*tmp);
            ans2=max(ans2,(h[i][j]+1)*(le[i][j]+ri[i][j]-1));
        }
    }
    printf("%d\n%d\n",ans1,ans2); 
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载文章,原文地址:http://blog.csdn.net/wzq_qwq/article/details/47167797

BZOJ 1057 [ZJOI2007]棋盘制作 最大子矩阵

标签:矩阵   方法   代码   解析   正方形   

原文地址:http://blog.csdn.net/wzq_qwq/article/details/47167797

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