← Home
```go
package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var N int
	fmt.Fscan(reader, &N)

	F := make([][]int32, N)
	for i := 0; i < N; i++ {
		F[i] = make([]int32, N)
		for j := 0; j < N; j++ {
			fmt.Fscan(reader, &F[i][j])
		}
	}

	S := make([][]int32, N)
	for i := 0; i < N; i++ {
		S[i] = make([]int32, N)
		for j := 0; j < N; j++ {
			fmt.Fscan(reader, &S[i][j])
		}
	}

	C := make([][]int, N+1)
	for i := 0; i <= N; i++ {
		C[i] = make([]int, N+1)
		C[i][0] = 1
		for j := 1; j <= i; j++ {
			C[i][j] = C[i-1][j-1] + C[i-1][j]
		}
	}

	getIndex := func(mask, k int) int {
		idx := 0
		for j := N - 1; j >= 0 && k > 0; j-- {
			if (mask & (1 << j)) != 0 {
				idx += C[j][k]
				k--
			}
		}
		return idx
	}

	maxComb := C[N][N/2]
	dp := make([][11]int32, maxComb)
	nextDp := make([][11]int32, maxComb)

	for i := 0; i < maxComb; i++ {
		for f := 0; f <= N/2; f++ {
			dp[i][f] = -1
		}
	}
	dp[0][0] = 0

	for i := 0; i < N; i++ {
		numNextMasks := C[N][i+1]
		for j := 0; j < numNextMasks; j++ {
			for f := 0; f <= N/2; f++ {
				nextDp[j][f] = -1
			}
		}

		var mask int
		if i == 0 {
			mask = 0
		} else {
			mask = (1 << i) - 1
		}

		fMin := 0
		if i-N/2 > 0 {
			fMin = i - N/2
		}
		fMax := i
		if N/2 < fMax {
			fMax = N/2
		}

		for mask < (1 << N) {
			idx := getIndex(mask, i)

			for c := 0; c < N; c++ {
				if (mask & (1 << c)) == 0 {
					newMask := mask | (1 << c)
					newIdx := getIndex(newMask, i+1)

					for f := fMin; f <= fMax; f++ {
						val := dp[idx][f]
						if val == -1 {
							continue
						}

						if (i + 1 - f) <= N/2 {
							cand := val + S[i][c]
							if cand > nextDp[newIdx][f] {
								nextDp[newIdx][f] = cand
							}
						}

						if f+1 <= N/2 {
							cand := val + F[i][c]
							if cand > nextDp[newIdx][f+1] {
								nextDp[newIdx][f+1] = cand
							}
						}
					}
				}
			}

			if i == 0 {
				break
			}
			c_bit := mask & -mask
			r := mask + c_bit
			mask = (((r ^ mask) >> 2) / c_bit) | r
		}

		dp, nextDp = nextDp, dp
	}

	fmt.Println(dp[0][N/2])
}
```