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;
}
原文地址:https://www.cnblogs.com/planche/p/8438173.html