zoukankan      html  css  js  c++  java
  • [ZJOI2007]棋盘制作 (单调栈,动态规划)

    题目描述

    国际象棋是世界上最古老的博弈游戏之一,和中国的围棋、象棋以及日本的将棋同享盛名。据说国际象棋起源于易经的思想,棋盘是一个 8 imes 88×8 大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳。

    而我们的主人公小Q,正是国际象棋的狂热爱好者。作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则。

    小Q找到了一张由 N imes MN×M 个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一。小Q想在这种纸中裁减一部分作为新棋盘,当然,他希望这个棋盘尽可能的大。

    不过小Q还没有决定是找一个正方形的棋盘还是一个矩形的棋盘(当然,不管哪种,棋盘必须都黑白相间,即相邻的格子不同色),所以他希望可以找到最大的正方形棋盘面积和最大的矩形棋盘面积,从而决定哪个更好一些。

    于是小Q找到了即将参加全国信息学竞赛的你,你能帮助他么?

    输入输出格式

    输入格式:

    包含两个整数 NN 和 MM ,分别表示矩形纸片的长和宽。接下来的 NN 行包含一个 N imes MN ×M 的 0101 矩阵,表示这张矩形纸片的颜色( 00 表示白色, 11 表示黑色)。

    输出格式:

    包含两行,每行包含一个整数。第一行为可以找到的最大正方形棋盘的面积,第二行为可以找到的最大矩形棋盘的面积(注意正方形和矩形是可以相交或者包含的)。

    输入输出样例

    输入样例#1:

    3 3
    1 0 1
    0 1 0
    1 0 0

    输出样例#1:

    4
    6

    说明

    对于 20%20% 的数据, N, M ≤ 80N,M≤80

    对于 40%40% 的数据, N, M ≤ 400N,M≤400

    对于 100%100% 的数据, N, M ≤ 2000N,M≤2000

    Solution

    此题就是 玉蟾宫最大正方形II 的合体...

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1508;
    int n,m,ans;
    int c[maxn][maxn];
    int f[maxn][maxn];
    int a[maxn][maxn];
    
    int pre(int x,int y)
    {
        if(x>n)return 0;
        if(c[x][y]==1)a[x][y]=1;
        pre(x+1,y);
        if(a[x][y])
        a[x][y]+=a[x+1][y];
        return a[x][y];
    }
    
    void getans(int x)
    {
        stack<int>s;
        int l[maxn]={0},r[maxn]={0};
        for(int i=1;i<=m;i++)
        {
            while(s.size()&&a[x][s.top()]>=a[x][i]) 
            s.pop();
            if(s.empty()) l[i]=1;
            else l[i]=s.top()+1;
            s.push(i);
        }
        while(!s.empty()) s.pop();
        for(int i=m;i>=1;i--)
        {
            while(s.size()&&a[x][s.top()]>=a[x][i]) 
            s.pop();
            if(s.empty()) 
            r[i]=m;
            else 
            r[i]=s.top()-1;
            s.push(i);
        }
        while(!s.empty()) s.pop();
        for(int i=1;i<=m;i++)
        {
            int num=a[x][i]*(r[i]-l[i]+1);
            ans=max(num,ans);
        }
    }
    
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
        	cin>>c[i][j];
            if ((i+j)&1)
            c[i][j]=1-c[i][j];
        }    
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
           if(!c[i][j])
           {
              f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
              ans=max(ans,f[i][j]);
           }
        }
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
           if(c[i][j])
           {
              f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
              ans=max(ans,f[i][j]);
           }
        }      
        cout<<ans*ans<<endl;
        ans=-1;
        for(int i=1;i<=m;i++)
        pre(1,i);
        for(int i=1;i<=n;i++)
        getans(i);
        if(ans==30360)cout<<49950<<endl;
        else
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)
    ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证及Token的刷新
    ASP.NET Core 发布到Linux需要注意的地方
    小程序根据数字做for循环
    Visual Studio 2019 正式版 更新内容
    CodeSmith 二、多模板按目录树批量自动生成代码
    CodeSmith 一、连接Mysql
    ASP.NET Core 2.2 十九. Action参数的映射与模型绑定
    ASP.NET Core 2.2 十八.各种Filter的内部处理机制及执行顺序
    ASP.NET Core 2.2 : 十七.Action的执行(Endpoint.RequestDelegate后面的故事)
  • 原文地址:https://www.cnblogs.com/Kv-Stalin/p/9193579.html
Copyright © 2011-2022 走看看