leetcode013-Maximal Square(dp)

来源:互联网 发布:微博怎么设置个性域名 编辑:程序博客网 时间:2024/05/19 02:21

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.

For example, given the following matrix:

1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0

Return 4.


解题思路:

动态规划:

1.首先确定问题的状态是什么,我想的是dp(i,j):以当前位置(i,j)作为立足点,向左(i,j-1),向上(i-1,j),向左上(i-1,j-1)尽可能大地拓展正方形时能够得到的正方形大小。

2.然后思考限制正方形拓展的原因有哪些?

2.1当前位置(i,j)的值为0,那么以它作为立足点,根本无法拓展,dp(i,j)=0

2.2当往三个方向拓展时,必须确保三个方向的拓展同程序进行,当其中某个方向无法拓展时立即终止。

现在,让我们把右下角的元素设为1。当拓展的step为1时,左、左上、上三个方向的拓展都没有问题;但当拓展的step为 2时却无法完成,因为左边方向无法形成边长为2的局部正方形。

因此,正方形的大小受到三个方向中能保证的最小局部正方形大小的限制。

3.思考状态转移方程,即如何由三个方向中的局部正方形的大小得到当前位置(i,j)的拓展正方形大小?

dp(i, j-1),dp(i-1, j),dp(i-1, j-1)分别代表三个方向上的局部正方形大小,由于2提到的受限,我们只需关注三者中最小的正方形大小,记为S

       取S的平方,即最小局部正方形的边长,由于当前位置为1且是即将形成的新正方形的右下角,因此S+1是新的边长。

dp(i,j) = (sqrt(min{dp(i, j-1),dp(i-1, j),dp(i-1, j-1)})+1)^2

class Solution {public:    int maximalSquare(vector<vector<char>>& matrix) {        int m = matrix.size();        if (m == 0) return 0;        int n = matrix[0].size();        if (n == 0) return 0;        vector<vector<int>> dp(m,vector<int>(n,0));        int mini = 0;        int temp = 0;        int result = 0;                for (int i = 0; i < n; i++) {            dp[0][i] = matrix[0][i]-'0';            result = dp[0][i] > result ? dp[0][i] : result;        }        for (int i = 0; i < m; i++) {            dp[i][0] = matrix[i][0]-'0';            result = dp[i][0] > result ? dp[i][0] : result;        }            for (int i = 1; i < m; i++) {            for (int j = 1; j < n; j++) {                mini = min(dp[i-1][j],dp[i][j-1]);                mini = min(mini,dp[i-1][j-1]);                temp = sqrt(mini);                if (matrix[i][j] > '0') {                    dp[i][j] = (temp+1)*(temp+1);                }                if (dp[i][j] > result) result =dp[i][j];            }        }        return result;    }};


原创粉丝点击