• 【BZOJ1057】棋盘制作(ZJOI2007)-DP+悬线法


    测试地址:棋盘制作
    做法:本题需要用到DP+悬线法。
    对于第一问,令f(i,j)为以(i,j)为右下角的最大合法正方形边长,lft(i,j)为从(i,j)向左最长的合法线段长度,up(i,j)为从(i,j)向上最长的合法线段长度,那么有:
    如果(i,j)(i1,j1)不同色,那么f(i,j)=1
    否则,f(i,j)=min(lft(i,j),up(i,j),f(i1,j1)+1)
    对于第二问,注意到这是一个求最大合法子矩阵的问题,我们可以用悬线法枚举所有的极大合法子矩阵,然后求出这些矩阵的最大面积即可。
    以下是本人代码:

    #include <bits/stdc++.h>
    using namespace std;
    int n,m,lft[2010][2010],rht[2010][2010],up[2010][2010];
    int f[2010][2010];
    bool g[2010][2010];
    
    void init()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&g[i][j]);
    }
    
    void calc()
    {
        for(int i=1;i<=n;i++)
        {
            lft[i][1]=1;
            for(int j=2;j<=m;j++)
                lft[i][j]=(g[i][j-1]==g[i][j])?1:lft[i][j-1]+1;
            rht[i][m]=1;
            for(int j=m-1;j>=1;j--)
                rht[i][j]=(g[i][j+1]==g[i][j])?1:rht[i][j+1]+1;
            if (i==1)
            {
                for(int j=1;j<=m;j++)
                    up[i][j]=1;
            }
            else
            {
                for(int j=1;j<=m;j++)
                    up[i][j]=(g[i-1][j]==g[i][j])?1:up[i-1][j]+1;
            }
        }
    }
    
    void dp1()
    {
        int ans=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                if (i==1||j==1) f[i][j]=1;
                else
                {
                    if (g[i-1][j-1]==g[i][j]) f[i][j]=min(f[i-1][j-1]+1,min(lft[i][j],up[i][j]));
                    else f[i][j]=1;
                }
                ans=max(f[i][j],ans);
            }
        printf("%d
    ",ans*ans);
    }
    
    void dp2()
    {
        int mnl,mnr,cnt,ans=0;
        for(int j=1;j<=m;j++)
            for(int i=1;i<=n;i++)
            {
                if (i==1||g[i][j]==g[i-1][j])
                    mnl=lft[i][j],mnr=rht[i][j],cnt=1;
                else mnl=min(mnl,lft[i][j]),mnr=min(mnr,rht[i][j]),cnt++;
                ans=max(ans,cnt*(mnl+mnr-1));
            }
        printf("%d",ans);
    }
    
    int main()
    {
        init();
        calc();
        dp1();
        dp2();
    
        return 0;
    }
  • 相关阅读:
    CentOS 静态IP设置&修改网卡名
    Centos 6.5 升级python到版本2.7.12
    VMware 安装Windows sever 2008 R2服务器
    RF安装
    Python的包管理工具pip
    Appium学习路—Android定位元素与操作
    MYSQL ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.10.210' (111) 解决方法
    MYSQL ERROR 1045 (28000): Access denied for user (using password: YES)解决方案详细说明
    CentOS下Apache默认安装路径
    Apache JMeter配置、安装
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793383.html
Copyright © 2020-2023  润新知