zoukankan      html  css  js  c++  java
  • 01二维矩阵中最大全为1的正方形maxSquare——经典DP问题(二维)

    在一个二维01矩阵中找到全为1的最大正方形

    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0


    以矩阵中每一个点作为正方形右下角点来处理,而以该点为右下角点的最大边长最多比以它的左方、上方和左上方为右下角的正方形边长多1,所以这时只能取另外三个正方形中最小的正方形边长+1。用d[i][j]表示以i,j坐标为右下角的正方形最大边。则有状态转移方程:dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1,具体代码如下:

     public static int maxSquare(int[][] matrix) {
            if (matrix.length==0||matrix[0].length==0) {
                return 0;
            }
            int M = matrix.length, N = matrix[0].length, res = 0;
            int[][] dp = new int[M][N];
            for (int i=0; i<M; i++) {
                if (matrix[i][0] == 1) {
                    dp[i][0] = 1;
                    res = 1;
                }
            }

            for (int j=0; j<N; j++) {
                if (matrix[0][j] == 1) {
                    dp[0][j] = 1;
                    res = 1;
                }
            }

            for (int i=1; i<M; i++) {
                for (int j=1; j<N; j++) {
                    if (matrix[i][j] == 1) {
                        dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;
                    }
                    res = max(res, dp[i][j]);
                }
            }
            return res;
        }

    采用动态规划方法正向依次利用之前存储的状态计算出下一个状态值,从而避免了重复计算,大大提升了时间复杂度。

  • 相关阅读:
    SqlServer——事务一进阶之锁的概念(SqlServer技术内幕 T-SQL程序设计 第九章)
    SqlServer——用户自定义函数
    HttpResponseMessage获取请求响应体内容
    如何获取Azure Storage Blob的MD5值
    Nuget安装nupkg文件
    Azure Storage Rest API Demo
    Java 调用Azure认知服务Demo--Computer API
    R语言安装加载包
    linux中的基础正则表达式
    修复组策略 这是启用组策略
  • 原文地址:https://www.cnblogs.com/bonelee/p/10154306.html
Copyright © 2011-2022 走看看