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 }