zoukankan      html  css  js  c++  java
  • P1387 最大正方形

    题目描述 
    在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。

    输入输出格式 
    输入格式: 
    输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.

    输出格式: 
    一个整数,最大正方形的边长

    输入输出样例 
    输入样例#1: 
    4 4 
    0 1 1 1 
    1 1 1 0 
    0 1 1 0 
    1 1 0 1 
    输出样例#1: 
    2

    解析:

    dp[i][j]代表(i,j)为右下角的正方形的最大边长

    有关正方形的dp好像都需要这么思考,找这几个中边长最小的更新 
    这里写图片描述 
    状态转移方程: dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 1005
    #define inf 0x3f3f3f3f
    
    int a[maxn][maxn];
    int dp[maxn][maxn];
    int n,m;
    int ans=0;
    int main()
    {
        cin>>n>>m;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                cin>>a[i][j];
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                if(a[i][j])
                {
                    dp[i][j]=min(dp[i-1][j],min(dp[i-1][j-1],dp[i][j-1]))+1;
                    ans=max(ans,dp[i][j]);
                }
        cout<<ans;
    
        return 0;
    }
  • 相关阅读:
    10. 正则表达式匹配
    5. 最长回文子串
    板子总结
    2020: 学生查询
    解决apt-get出错
    03如何计算算法的复杂度
    ad如何从PCB中导出元件封装库
    调车遇到的问题及解决办法
    java报错与解决方法总结
    SWD下载k60
  • 原文地址:https://www.cnblogs.com/planche/p/8438173.html
Copyright © 2011-2022 走看看