#include<iostream>
using namespace std;
int a[100][100], sum = 0, minn = 2147483647, i, j, n;
int b[100];
void dfs(int dep)
{
int r;
for (r = 1; r <= n; ++r)//dep表示第几个人,r表示工作
if (!b[r]) //如果第r件工作没有被选择
{
b[r] = 1;
sum += a[dep][r];//a[dep][r]表示第dep个人做第r个工作的费用
if (dep == n && sum < minn) //递归出口,如果当前代价更小,进行更新
{
minn = sum;
}
if (dep != n)
{
if (sum < minn)//sum小于min,继续遍历该结点一下部分,否则剪枝(不进行这种分配)
dfs(dep + 1);
}
sum -= a[dep][r];//回溯一步
b[r] = 0;
}
}
int main()
{
cin >> n; //工作数
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
cin >> a[i][j];
dfs(1);
cout << minn << endl;
return 0;
}