← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

var n int
var pref [51][51]int
var dp [50][50][50][50]uint16

func count(x1, x2, y1, y2 int) int {
	return pref[x2+1][y2+1] - pref[x1][y2+1] - pref[x2+1][y1] + pref[x1][y1]
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	fmt.Fscan(in, &n)
	grid := make([]string, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &grid[i])
	}

	for i := 0; i < n; i++ {
		for j := 0; j < n; j++ {
			pref[i+1][j+1] = pref[i][j+1] + pref[i+1][j] - pref[i][j]
			if grid[i][j] == '#' {
				pref[i+1][j+1]++
			}
		}
	}

	for h := 1; h <= n; h++ {
		for w := 1; w <= n; w++ {
			base := h
			if w > base {
				base = w
			}
			for x1 := 0; x1+h <= n; x1++ {
				x2 := x1 + h - 1
				for y1 := 0; y1+w <= n; y1++ {
					y2 := y1 + w - 1
					if count(x1, x2, y1, y2) == 0 {
						dp[x1][x2][y1][y2] = 0
						continue
					}
					res := base
					for k := x1; k < x2; k++ {
						v := int(dp[x1][k][y1][y2]) + int(dp[k+1][x2][y1][y2])
						if v < res {
							res = v
						}
					}
					for k := y1; k < y2; k++ {
						v := int(dp[x1][x2][y1][k]) + int(dp[x1][x2][k+1][y2])
						if v < res {
							res = v
						}
					}
					dp[x1][x2][y1][y2] = uint16(res)
				}
			}
		}
	}

	fmt.Fprintln(out, dp[0][n-1][0][n-1])
}