def main():
    m, n = map(int, input().split())
    a = [input() for _ in range(m)]
    if m < n:
        a = list(zip(*a))
        m, n = n, m

    INF = m * n
    dp = [[0 for _ in range(n)] for _ in range(n)]
    new_dp = [[0 for _ in range(n)] for _ in range(n)]
    
    psum = [0 for _ in range(n + 1)]
    for i in range(m):
        for j in range(n):
            psum[j + 1] = psum[j] + ord(a[i][j]) - ord("0")

        prev = list(dp[0])
        for x in range(n):
            for y in range(n):
                new_dp[x][y] = INF

        for l in range(n):
            prev = [min(p, d) for p, d in zip(prev, dp[l])]
            best = prev[l] if l == 0 else prev[l - 1]
            for r in range(l, n):
                cost = (
                    psum[l]
                    + (r - l + 1)
                    - (psum[r + 1] - psum[l])
                    + (psum[n] - psum[r + 1])
                )
                best = min(best, prev[r])
                if i == 0:
                    best = 0 if l == 0 else INF
                new_dp[l][r] = min(new_dp[l][r], cost + best)

        dp, new_dp = new_dp, dp

    print(min(row[-1] for row in dp))


if __name__ == "__main__":
    main()
