zoukankan      html  css  js  c++  java
  • 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)。这个道理想想显而易见,却又不是那么理所当然,总之挺奇妙的。这也算是一道典型题目吧。

  • 相关阅读:
    2021.6.7
    2021.6.4
    2021.6.3
    2021.6.2 团队第二阶段冲刺第十天
    2021.6.1 团队第二阶段冲刺第九天
    2021.5.31 团队第二阶段冲刺第八天
    2021.5.30 团队第二阶段冲刺第七天
    逻辑卷的使用
    磁盘阵列
    磁盘配额
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/6012119.html
Copyright © 2011-2022 走看看