代码有些丑陋,但也分享一下解题思路
算法:动态规划
状态定义:arry[i][j]表示(i,j)为边界,向左上方看,能够组成的最大正方形的边长。
状态转换:分情况讨论
1、matrix[i][j] = 0 ,那么arry[i][j] = 0;
2、matrix[i][j] != 0,再分情况讨论:
(1)arry[i - 1][j] == arry[i][j - 1]
(2)arry[i - 1][j] != arry[i][j - 1]
代码如下:
int min(int a , int b)
{
return a > b ? b : a;
}
int maximalSquare(char** matrix, int matrixSize, int* matrixColSize){
//动态规划:
int m = matrixSize;
int n = *matrixColSize;
int arry[m][n];
int ret = 0;//返回值
//初始化:
for(int i = 0 ; i < n ; i++)
{
arry[0][i] = matrix[0][i] - 48;
}
for(int j = 0 ; j < m ; j++)
{
arry[j][0] = matrix[j][0] - 48;
}
//核心算法:
for(int i = 0 ; i < m ; i++)
{
for(int j = 0 ; j < n ; j++)
{
if(i != 0 && j != 0)
{
if(matrix[i][j] == 48)
{
arry[i][j] = 0;
}
else//matrix[i][j] = 1
{
if(arry[i][j - 1] == arry[i - 1][j])
{
int num = arry[i][j - 1];
if(matrix[i - num][j - num] == 49)
{
arry[i][j] = num + 1;
}
else{
arry[i][j] = num;
}
}
else{
arry[i][j] = min(arry[i - 1][j] , arry[i][j - 1]) + 1;
}
}
}
}
}
for(int i = 0 ; i < m ; i++)
{
for(int j = 0 ; j < n ; j++)
{
if(arry[i][j] > ret)
ret = arry[i][j];
}
}
return ret*ret;
}