动态规划变形题。
题目链接:
https://leetcode-cn.com/problems/largest-1-bordered-square/
1.只需考虑创建一个三维数组,dp[i][j][0]用以维护以i,j为终止点的左连续1的个数,dp[i][j][1]用以维护以i,j为终止点的上连续1的个数。
2.得到两者较小值d后,将其与dp[i][j-d][0]和dp[i-d][j][1]进行比较,如果d+1大于其中任何一个,则将d--.
3.最后取result和d+1较
class Solution {
public:
int largest1BorderedSquare(vector<vector<int>>& grid) {
int m=grid.size();
if(m==0)return 0;
int n=grid[0].size();
int dp[m+1][n+1][2]; //[0]维护左边连续1个数,[1]维护y右边连续1个数
memset(dp,0,sizeof(dp));
int result=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(grid[i-1][j-1])
{
int d=min(dp[i][j-1][0],dp[i-1][j][1]);
while(d>0&&(dp[i][j-d][1]-1<d||dp[i-d][j][0]-1<d))
{
d--;
}
result=max(result,d+1);
dp[i][j][0]=dp[i][j-1][0]+1;
dp[i][j][1]=dp[i-1][j][1]+1;
}
else
{
dp[i][j][0]=0;
dp[i][j][1]=0;
}
}
}
return result*result;
}
};
大者。并更新dp[i+1][j+1][0],dp[i+1][j+1][1]