在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximal-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
DP 状态转移方程 是抄的,自己没有想出来:
d p i , j = min ( d p i − 1 , j , d p i − 1 , j − 1 , d p i , j − 1 ) dp_{i, j} = \min{(dp_{i-1,j}, dp_{i-1,j-1}, dp_{i,j-1})} dpi,j=min(dpi−1,j,dpi−1,j−1,dpi,j−1)
我在 DP算法上,弄得真的很差,连思路都没有。
【图片来源】
还有一个问题:我仍然是在不断的通过测试,寻找边界,异常糟糕呀。
class Solution {
public:
int min(int a, int b, int c)
{
int tmp = a<b?a:b;
return tmp<c?tmp:c;
}
int maximalSquare(vector<vector<char>>& matrix) {
int h = matrix.size();
if(h == 0)
return 0;
int w = matrix[0].size();
int dp[h][w];
int max_s = 0;
dp[0][0] = matrix[0][0]-'0'; //(0,,0)位置
for(int i=0; i<h; i++)
for(int j=0; j<w; j++)
{
if(matrix[i][j]=='0')
{
dp[i][j] = 0;
continue;
}
if(j-1<0 || i-1<0) // 边界
dp[i][j] = 1;
else
dp[i][j] = min(dp[i-1][j], dp[i-1][j-1], dp[i][j-1]) + 1; //状态转移
if(max_s < dp[i][j])
max_s = dp[i][j];
}
return max_s*max_s;
}
};
写了一个很糟糕的bug,是这样的:
if(j-1<0 || i-1<0) // 边界
{
dp[i][j] = 1;
continue;
}
dp[i][j] = min(dp[i-1][j], dp[i-1][j-1], dp[i][j-1]) + 1; //状态转移
if(max_s < dp[i][j])
max_s = dp[i][j];
对,就是少了一个 else
,但是错的很远,如果输入是 [[1,2,3]]
这种的话,结果会很惨的,实际上,我学到的经验是:能else, 就不要continue,会干扰逻辑
今天学到几个道理:
- 后其身而身先,外其身而身存
- 绵绵若息,用之不勤
第一个是说,保持谦虚谨慎的不断进去,才能真正的领先;置死地方能后生。
第二个说,任何道理都要付诸于实践,付诸于天长地久,不断反思,不断改进。