Problem:
Largest Square

Given a matrix (H × W) which contains only 1 and 0, find the area of the largest square matrix which only contains 0s.

Input

H W
c1,1 c1,2 ... c1,W
c2,1 c2,2 ... c2,W
:
cH,1 cH,2 ... cH,W

In the first line, two integers H and W separated by a space character are given. In the following H lines, ci,j, elements of the H × W matrix, are given.

Output

Print the area (the number of 0s) of the largest square.

Constraints

1 ≤ H, W ≤ 1,400

Sample Input

4 5
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
0 0 0 1 0

Sample Output

4

Solution in C (judge verdict: Accepted)

#include<stdio.h>
#define MAX 1400
int dp[MAX][MAX], map[MAX][MAX];
int large_square(int h, int w);
int main(void)
{
  int i, j, h, w;
  scanf("%d%d", &h, &w);
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      scanf("%d", &map[i][j]);
    }
  }
  printf("%d\n", large_square(h, w));
}
int large_square(int h, int w)
{
  int i, j, maxw = 0;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      dp[i][j] = (map[i][j] + 1) % 2;
      maxw |= dp[i][j];
    }
  }
  for (i = 1; i < h; i++) {
    for (j = 1; j < w; j++) {
      if (map[i][j]) dp[i][j] = 0;
      else {
        int temp = (dp[i-1][j] < dp[i][j-1] ? dp[i-1][j] : dp[i][j-1]);
        dp[i][j] = (dp[i-1][j-1] < temp ? dp[i-1][j-1] + 1 : temp + 1);
        if (maxw < dp[i][j]) maxw = dp[i][j];
      }
    }
  }
  return maxw * maxw;
}