221. 最大正方形
mid
在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。
DP
若某格子值为 1,则以此为右下角的正方形的、最大边长为:上面的正方形、左面的正方形或左上的正方形中,最小的那个,再加上此格。
这个转移方程比较神奇,感受一下就好

func maximalSquare(matrix [][]byte) int {
	rows, cols := len(matrix), len(matrix[0])
	dp := make([][]int, rows)
	for i := 0; i < rows; i++ {
		dp[i] = make([]int, cols)
	}
	maxSideLen := 0
	// 先给第0行和第0列赋值
	for y := 0; y < cols; y++ {
		if matrix[0][y] == '1' {
			dp[0][y] = 1
			maxSideLen = 1
		} else {
			dp[0][y] = 0
		}
	}
	for x := 0; x < rows; x++ {
		if matrix[x][0] == '1' {
			dp[x][0] = 1
			maxSideLen = 1
		} else {
			dp[x][0] = 0
		}
	}
	for x := 1; x < rows; x++ {
		for y := 1; y < cols; y++ {
			if matrix[x][y] == '1' {
				dp[x][y] = min(dp[x-1][y-1], min(dp[x-1][y], dp[x][y-1])) + 1
				if dp[x][y] > maxSideLen {
					maxSideLen = dp[x][y]
				}
			}
		}
	}
	return maxSideLen * maxSideLen
}
func min(a, b int) int {
	if a < b {
		return a
	} else {
		return b
	}
}