经典算法题之Maximal Square
来源:互联网 发布:淘宝smastudio是谁的店 编辑:程序博客网 时间:2024/06/10 21:37
前言
Maximal Square是道非常有意思的算法题。它是一个典型的动态规划问题,同时也是2017京东面试题,2016华为机考题。
题目描述
有一个n*m大小的矩阵,其元素值为0或者1,求这个矩阵中全有1组成的最大方块其大小。
输入描述
每个输入包含一个测试用例。每个测试用例的第一行包含两个整数n(2<= n <= 50),m(2<= n <= 50),分别表示矩阵matrix的行数与列数。接下来的每一行是该矩阵的每一行元素,其取值为1或者0。
输出描述
输出矩阵中全有1组成的最大方块的大小。
输入样例
4 6
1 1 0 1 1 1
0 1 1 1 1 1
1 1 0 1 1 1
1 1 0 0 1 1
输出样例
3
思路分析:
本题为一个典型的动态规划问题,因此可以使用动态规划的思想进行。动态规划重要的一个特点是要复用子问题。
假设以matrix[i][j]为右下顶点的最大方块的大小为dp[i][j]。那么dp[i][j]的计算否可以复用比其更小的子问题呢?不难想象,如果matrix[i][j]=0,那么dp[i][j]=0。当matrix[i][j]=1时,此时要考察dp[i-1][j-1],dp[i-1][j]及dp[i][j-1],这是由于以matrix[i][j]的为右下顶点的最大方块由上面三个位置决定,而且是木桶效应,由最小值所决定,即dp[i][j]=min{dp[i-1][j-1], dp[i-1][j], dp[i][j-1]} + 1。考虑到边界条件,可以得到最终的递归方程为:
只需要找到最大的dp[i][j]值即得到最大方块的大小。整个算法的时间复杂度与空间复杂度均为O(n*m)。
具体实现代码(C++)
- 经典算法题之Maximal Square
- 算法题 lintcode 434 Maximal Square
- Maximal Square算法详解
- 算法练习:Maximal Square
- leetcode之Maximal Square
- leetcode之maximal square
- 每周LeetCode算法题(八): 题目: 221. Maximal Square & 85. Maximal Rectangle
- Medium 221题 Maximal Square
- Maximal Square
- Maximal Square
- Maximal Square
- Maximal Square
- Maximal Square
- Maximal Square
- Maximal Square
- Maximal Square
- Maximal Square
- Maximal Square
- hdfs下载copyToLocalFile报NullPointerException解决方法
- 深入理解ES6 --解构
- STL List和Deque在删除元素时的区别
- 基于梯度的优化方法
- C语言qsort的用法和使用
- 经典算法题之Maximal Square
- 如何抓取淘宝上的商品信息和详情页信息
- HDU
- HTTP请求报文和HTTP响应报文
- Paint画笔的基本使用——渲染
- Spring Boot(Web)初探二( 配置文件)
- 安装centos虚拟机后发现xshell登录很慢解决办法
- 面试OR笔试34——方格中的移动范围
- C++重载运算符