1.简单的动态规划 以当前点为右下角建立正方形 if当前点是1 那么就要判断 他的左边 上面 左上方三个点 是否能各自构成正方形 取三个点的最小边(因为题目要求的是正方形面积 所以必须得保证构成正方形) + 1 就是当前点能构成正方形的边长 列出一个状态方程 就OK 了
private function maxSquare($arr)
{
$dp = [];
$max = 0;
for ($i = 0; $i < count($arr); $i++) {
if ($arr[$i][0] == 1) {
$dp[$i][0] = 1;
$max = 1;
}
}
for ($j = 0; $j < count($arr[0]); $j++) {
if ($arr[0][$j] == 1) {
$dp[0][$j] = 1;
$max = 1;
}
}
for ($i = 0; $i < count($arr); $i++) {
for ($j = 0; $j < count($arr[0]); $j++) {
if ($arr[$i][$j] == 1) {
$dp[$i][$j] = min($dp[$i][$j - 1], $dp[$i - 1][$j], $dp[$i - 1][$j - 1]) + 1;
$max = max($dp[$i][$j], $max);
}
}
}
return $max * $max;
}