力扣 221. 最大正方形 [线性DP]

Posted 布图

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣 221. 最大正方形 [线性DP]相关的知识,希望对你有一定的参考价值。

题目

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100

解释与代码

暴力写法不说了

我看了一下题解,发现我的想法只差了一点,当然差的是最关键的那一点

状态转移公式,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1

我看了一下题解上的图片,然后就有灵感了,然后写了下面的代码,过了,虽然是dp,但是比较复杂,可以化简

class Solution {
    public:
    int dp[400][400];
    int maximalSquare(vector<vector<char>>& matrix) {
        int maxx = 0;
        int n = matrix.size(), m = matrix[0].size();
        for (int i=0; i<n; i++) {//dp数组可以用原来的matrix数组来代替
            for (int j=0; j<m; j++) {
                if (matrix[i][j] == '0') {
                    dp[i][j] = 0;
                } else {
                    dp[i][j] = 1;
                }
                maxx = max(maxx, dp[i][j]);
            }
        }
        for (int i=1; i<n; i++) {
            for (int j=1; j<m; j++) {
                if (dp[i-1][j] == dp[i][j-1] && dp[i-1][j] == dp[i-1][j-1]) {//三个相等
                    if (dp[i-1][j] != 0) {//非0
                        if (dp[i][j] == 1 ) {//本节点是1
                            dp[i][j] = dp[i][j-1] + 1;//+1
                        }
                    }
                } else {//三个不等
                    if (dp[i][j] == 1) {//1
                        int minn = min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]);//找出最小然后+1
                        dp[i][j] = minn + 1;
                    }
                }
                maxx = max(maxx, dp[i][j]);
            }
        }
        return maxx*maxx;
    }
};

化简版:

class Solution {
    public:
    int dp[400][400];
    int maximalSquare(vector<vector<char>>& matrix) {
        int maxx = 0;
        int n = matrix.size(), m = matrix[0].size();
        for (int i=0; i<n; i++) {//dp数组可以用原来的matrix数组来代替
            for (int j=0; j<m; j++) {
                if (matrix[i][j] == '0') {
                    dp[i][j] = 0;
                } else {
                    dp[i][j] = 1;
                }
                maxx = max(maxx, dp[i][j]);
            }
        }
        for (int i=1; i<n; i++) {
            for (int j=1; j<m; j++) {
                if (dp[i][j] == 1) {
                    int minn = min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]);//找出最小然后+1
                    dp[i][j] = minn + 1;
                }
                maxx = max(maxx, dp[i][j]);
            }
        }
        return maxx*maxx;
    }
};

以上是关于力扣 221. 最大正方形 [线性DP]的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 221. 最大正方形(dp)

[LeetCode] 221. 最大正方形(DP)

2021-12-11:最大正方形。在一个由 ‘0‘ 和 ‘1‘ 组成的二维矩阵内,找到只包含 ‘1‘ 的最大正方形,并返回其面积。力扣221。

5/8 LeetCode每日一题 221. 最大正方形

[LeetCode]最大系列(最大正方形221,最大加号标志764)

221. 最大正方形