棋子

导航

Maximal Square leetcode

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 }

 

posted on 2015-08-21 23:52  鼬与轮回  阅读(175)  评论(0编辑  收藏  举报