func maximalRectangle(matrix [][]byte) int {
n, m := len(matrix), len(matrix[0])
max := 0
f := make([][]int, n)
for i := 0; i < n; i ++ {
f[i] = make([]int, m)
}
for i := 0; i < n; i ++ {
for j := 0; j < m; j ++ {
if matrix[i][j] == '1' {
f[i][j] = 1
if j > 0 {
f[i][j] += f[i][j - 1]
}
}
for k, min := i, f[i][j]; k >= 0 && min > 0; k -- {
if min > f[k][j] {
min = f[k][j]
}
if area := int(min) * (i - k + 1); max < area {
max = area
}
}
}
}
return max
}