using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Globalization; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); static int[] NMi => ReadLine().Split().Select(c => int.Parse(c) - 1).ToArray(); static int[][] NMap(int n) => Enumerable.Repeat(0, n).Select(_ => NMi).ToArray(); static string[] SList(long n) => Enumerable.Repeat(0, (int)n).Select(_ => ReadLine()).ToArray(); static long[] LList(long n) => Enumerable.Repeat(0, (int)n).Select(_ => long.Parse(ReadLine())).ToArray(); public static void Main() { Solve(); } static void Solve() { var n = NN; var d = NArr(n); var bitmax = 1 << n; var INF = int.MaxValue / 3; var dp = new int[bitmax, n]; for (var i = 0; i < bitmax; ++i) for (var j = 0; j < n; ++j) dp[i, j] = INF; dp[1, 0] = 0; for (var b = 1; b < bitmax; ++b) { var p = Popcount(b); for (var i = 0; i < n; ++i) { if ((b & (1 << i)) == 0) continue; for (var j = 0; j < n; ++j) { var next = b | (1 << j); if (next == b) continue; dp[next, j] = Math.Min(dp[next, j], dp[b, i] + d[i][j] * (n - p)); } } } var ans = INF; for (var i = 0; i < n; ++i) ans = Math.Min(ans, dp[bitmax - 1, i]); WriteLine(ans); } static int Popcount(long n) { var c = (n & 0x5555555555555555) + ((n>>1) & 0x5555555555555555); c = (c & 0x3333333333333333) + ((c>>2) & 0x3333333333333333); c = (c & 0x0f0f0f0f0f0f0f0f) + ((c>>4) & 0x0f0f0f0f0f0f0f0f); c = (c & 0x00ff00ff00ff00ff) + ((c>>8) & 0x00ff00ff00ff00ff); c = (c & 0x0000ffff0000ffff) + ((c>>16) & 0x0000ffff0000ffff); c = (c & 0x00000000ffffffff) + ((c>>32) & 0x00000000ffffffff); return (int)c; } }