h, w = map(int, input().split()) kangaroo = [[x for x, c in enumerate(input()) if c == "#"] for _ in range(h)] positions_sublist = [(x,) for x in range(w - 1)] positions_list = [(), *positions_sublist] for cans in range(w // 2 + 1): positions_sublist = [(*prevs, prev, x) for *prevs, prev in positions_sublist for x in range(prev + 2, w - 1)] positions_list.extend(positions_sublist) memo = [[0] * len(positions_list) for _ in range(h + 2)] for y in range(3, h + 2, 2): for i, positions in enumerate(positions_list): memo[y][i] = min((memo[y - 2][j] + len(new_pos) for j, new_pos in enumerate(positions_list) # Calculate whether `new_pos` covers the kangaroo at position `y - 2` if (not (1 <= y - 2 < len(kangaroo)) or all(all(x in new_pos or x - 1 in new_pos for x in kangaroo[y]) for y in range(y - 3, y - 1))) # Calculate whether `new_pos` is allowed to stack on `positions` and all(any(x in positions for x in range(x - 1, x + 2)) for x in new_pos)), default=1e10) print(memo[h + 1][-1])