题意:求二维矩阵内的正方形面积(注意:二维矩阵不一定是正方形矩阵),分别从递归法和DP法分析这道题
#include<iostream>
#include<vector>
//#include<algorithm>
using namespace std;
//方法一:递归算法
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int max = 0, length = 0;
if (!matrix.size()) {
return max;
}
for (int i = 0; i < matrix.size(); ++i)
for (int j = 0; j < matrix[0].size(); ++j) {
if (matrix[i][j] == '1')
{
length = 1;
max = max >= length ? max : length;
recursion(matrix, i, j, max, length);
}
}
return max * max;
}
void recursion(vector<vector<char>>& matrix, int i, int j, int& max, int length) {
if ((i + length) >= matrix.size() || (j + length) >= matrix[0].size()) {
return;
}
bool flag = true;
for (int n = j; n <= j + length; ++n) {
if (matrix[i + length][n] == '0') {
flag = false;
break;
}
}
for (int m = i; m < i + length; ++m) {
if (matrix[m][j + length] == '0') {
flag = false;
break;
}
}
if (flag) {
length += 1;
max = max >= length ? max : length;
recursion(matrix, i, j, max, length);
}
return;
}
};
//方法二:动态规划DP
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (!matrix.size()) return 0;
vector<vector<int>> dp(matrix.size() + 1, vector<int>(matrix[0].size() + 1));
int max = 0;
for (int i = 1; i <= matrix.size(); ++i)
for (int j = 1; j <= matrix[0].size(); ++j)
{
if (matrix[i - 1][j - 1] == '1') {
dp[i][j] = min(dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j]) + 1;
max = dp[i][j] > max ? dp[i][j] : max;
}
else
dp[i][j] = 0;
}
return max*max;
}
int min(int x, int y, int z) {
if (x < y)
return x < z ? x : z;
else
return y < z ? y : z;
}
};