思路:
221题和1277题非常相似,思路也相同,不同的是状态转移方程变了一点,由取最大值,变成了加法。
以最大正方形为例,考虑当前i行j列,dpij代表为右下顶点为ij的正方形的最大边长,那么状态是由三个方向的状态转移而来的,分别是相邻左边,相邻上边,相邻左上角。所以,dp[i][j]=1+min(dp[i][j-1],dp[i-1][j],dp[i-1][j-1])。
代码:
class Solution {
public:
int dp1[10000];
int maximalSquare(vector<vector<char>>& matrix) {
if(!matrix.size())return 0;
int maxx=0;
int n=matrix.size(),m=matrix[0].size();
int dp[n+2][m+2];
memset(dp,0,sizeof(dp));
int pre=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char c=matrix[i-1][j-1];
//int tmp=dp1[j];
if(c=='1')
{
dp[i][j]=1+min(min(dp[i][j-1],dp[i-1][j]),(dp[i-1][j-1]));
//dp1[j]=1+min(dp1[j],min(dp1[j-1],pre));
maxx=max(maxx,dp[i][j]);
}else dp[i][j]=0;
//pre=tmp;
}
}
return maxx*maxx;
}
};
class Solution {
public:
int dp[1000][1000];
int countSquares(vector<vector<int>>& matrix) {
int n=matrix.size();
if(!n)return 0;
int m=matrix[0].size();
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(j==0||i==0)
{
dp[i][j]=matrix[i][j];
}else if(matrix[i][j])
{
dp[i][j]=1+min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]));
}
ans+=dp[i][j];
}
}
return ans;
}
};