zoukankan      html  css  js  c++  java
  • 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 }
    手里拿着一把锤子,看什么都像钉子,编程界的锤子应该就是算法了吧!
  • 相关阅读:
    NET在后置代码中输入JS提示语句(背景不会变白)
    corev4.css 左菜单修改CSS
    寺庙里的那点荡事儿
    sharepoint 2010中通过命令部署和卸载FEATURE
    定时任务 Timer JOB
    获取MOSS个人站点的SPWeb对象
    C#对Active Directory进行增删修查的类源码
    权限操作
    在SharePoint中,检验用户(SPUser)是否属于给定的组(SPGroup)的方法(代码)
    DirectoryEntry所有字段对应解释
  • 原文地址:https://www.cnblogs.com/chess/p/4749331.html
Copyright © 2011-2022 走看看