Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.
For example, given the following matrix:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
Return 4.
分析:这是一道DP题,首先说明,动态规划最重要的就是要找到那个递推公式!然而这道题目的递推公式,我也是网上搜索到的!无法正面递归过去。但是,我认为,数学中的一句名言:你解决的问题越多,你能解决下一道问题的概率就越大。所以好好加油吧,自己接触动态规划的时间还不长,加强训练,好好加油!
该题的递推公式:首先令f(i,j)表示以(i,j)为右下角的正方形的边长(构成最大的全'1'正方形)。
那么,f(i,j)=Min{f(i-1,j),f(i-1,j-1),f(i,j-1)}+1,该公式的前提是:当前点(i,j)的值必须为1.
递归,应当从左上角开始,逐行遍历下去,当然第一行(序号0),第一列(序号为0)没有必要进行,直接将其值初始化为所在点的原值。
代码如下:(首先去除数组为空之类的边界条件)
1 #include<iostream>
2 #include<vector>
3 using namespace std;
4 class Solution {
5 public:
6 int maximalSquare(vector<vector<char>>& matrix) {
7 if (matrix.size() == 0)
8 return 0;
9 if (matrix.size() == 1)
10 {
11 int flag = 0;
12 for (int i = 0; i < matrix[0].size(); ++i)
13 {
14 if (matrix[0][i] == '1')
15 flag=1;
16 }
17 return flag;
18 }
19 int max = 0;
20 vector<vector<int>> mark;
21 for (int i = 0; i < matrix.size(); ++i)
22 {
23 vector<int> temp = {};
24 for (int j = 0; j < matrix[i].size(); ++j)
25 {
26 if (matrix[i][j] == '1')
27 {
28 temp.push_back(1);
29 }
30 else temp.push_back(0);
31 }
32 mark.push_back(temp);
33 }
34 for (int i = 0; i < mark.size();++i)
35 for (int j = 0; j < mark[i].size(); ++j)
36 {
37 if (i>0&&j>0&&1 == mark[i][j])
38 mark[i][j] = threeMin(mark[i - 1][j], mark[i - 1][j - 1], mark[i][j - 1]) + 1;
39 if (mark[i][j]>max)
40 max = mark[i][j];
41 }
42 return max*max;
43 }
44 int threeMin(int v1, int v2, int v3)
45 {
46 int temp = v1 < v2 ? v1 : v2;
47 return temp < v3 ? temp : v3;
48 }
49 };
50 int main()
51 {
52 Solution test;
53 vector<vector<char>> val = {
54 {'0','0','1'},
55 {'1','1','1'},
56 {'0','1','1'}
57 };
58 //vector<vector<char>> val = {
59 // { '0', '1' },
60 // { '1', '0'},
61 //};
62 int resu = test.maximalSquare(val);
63 cout << resu << endl;
64 return 0;
65 }
来源:https://www.cnblogs.com/chess/p/4749331.html