1387 最大正方形

难度:普及/提高-

题目类型:动规

提交次数:1

涉及知识:多维动规

题目描述

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

输入输出格式

输入格式:

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

输出格式:

一个整数,最大正方形的边长

代码:

 1 #include<iostream>
 2 using namespace std;
 3 int d[105][105];
 4 int minn(int a, int b, int c){
 5     return min(a, min(b, c));
 6 }
 7 int main(){
 8     int n;
 9     cin>>n;
10     int i, j;
11     for(i = 1; i <= n; i++)
12         for(j = 1; j <= n; j++)
13             cin>>d[i][j];
14     int maxx = 0;
15     for(i = 1; i <= n; i++){
16         for(j = 1; j <= n; j++){
17             if(d[i][j] == 1){
18                 d[i][j] = minn(d[i-1][j], d[i][j-1], d[i-1][j-1])+1;
19                 maxx = max(maxx, d[i][j]);
20             }
21         }
22     }
23     cout<<maxx;
24     return 0;
25 }

备注:

d[i][j] 表示以(i,j)为右下角的最大正方形的边长。状态转移方程式d[i][j]=min(d[i-1][j],d[i][j-1],d[i-1][j-1]) (if d[i][j]==1)。这个道理想想显而易见,却又不是那么理所当然,总之挺奇妙的。这也算是一道典型题目吧。

原文地址:https://www.cnblogs.com/fangziyuan/p/6012119.html