Maximal Square leetcode
2015-08-21 23:52
239 查看
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:
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)没有必要进行,直接将其值初始化为所在点的原值。
代码如下:(首先去除数组为空之类的边界条件)
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)没有必要进行,直接将其值初始化为所在点的原值。
代码如下:(首先去除数组为空之类的边界条件)
#include<iostream> #include<vector> using namespace std; class Solution { public: int maximalSquare(vector<vector<char>>& matrix) { if (matrix.size() == 0) return 0; if (matrix.size() == 1) { int flag = 0; for (int i = 0; i < matrix[0].size(); ++i) { if (matrix[0][i] == '1') flag=1; } return flag; } int max = 0; vector<vector<int>> mark; for (int i = 0; i < matrix.size(); ++i) { vector<int> temp = {}; for (int j = 0; j < matrix[i].size(); ++j) { if (matrix[i][j] == '1') { temp.push_back(1); } else temp.push_back(0); } mark.push_back(temp); } for (int i = 0; i < mark.size();++i) for (int j = 0; j < mark[i].size(); ++j) { if (i>0&&j>0&&1 == mark[i][j]) mark[i][j] = threeMin(mark[i - 1][j], mark[i - 1][j - 1], mark[i][j - 1]) + 1; if (mark[i][j]>max) max = mark[i][j]; } return max*max; } int threeMin(int v1, int v2, int v3) { int temp = v1 < v2 ? v1 : v2; return temp < v3 ? temp : v3; } }; int main() { Solution test; vector<vector<char>> val = { {'0','0','1'}, {'1','1','1'}, {'0','1','1'} }; //vector<vector<char>> val = { // { '0', '1' }, // { '1', '0'}, //}; int resu = test.maximalSquare(val); cout << resu << endl; return 0; }
相关文章推荐
- 零基础学python-7.3 字符串的一般使用
- 使用套接字的四个步骤
- HDU - 4126 Genghis Khan the Conqueror(树形DP + 最小生成树)
- yii2 数据库查询笔记
- SQL语句练习
- 以phoneGap作为承载容器是ios会上下滑动
- linux命令- 挂载命令 mount
- 关于Java关键字synchronized——单例模式的思考
- Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)
- TCP使用过程
- jor(1):简表(JOR)开源的报表工具调研
- [LeetCode#40]Combination Sum II
- 希望能持之以恒的学习、学习、再学习
- 多语言报表的修改方法
- 初中生可以学武汉北大青鸟什么专业课程?学完之后从事什么工作?
- 写作驱动学习
- 我不知道该怎么去做
- ubuntu14.04LTS更新源
- DMA : Timer Trigger Memory-to-memory mode,
- Handler classes should be static or leaks might occur