#include <cstdio>
#include <string>
#define oo 0x3f3f3f3f
#define maxn 202
int cap[maxn][maxn], cost[maxn][maxn], val[maxn];
int n, source, sink;
int d[maxn],t[maxn];
void read()
{
freopen("cc.in","r",stdin);
scanf("%d\n", &n);
int i, j, w;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
scanf("%d ", &w);
cost[i][j+n]=w;
cost[j+n][i]=-w;
cap[i][j+n]=1;
}
source=0, sink=n+n+1;
for(i=1;i<=n;++i) cost[source][i]=0, cost[i][source]=0, cap[source][i]=1;
for(i=n+1;i<sink;++i) cost[i][sink]=0, cost[sink][i]=0, cap[i][sink]=1;
}
int dijkstra()
{
int d[maxn],t[maxn], i, min, u;
bool viz[maxn];
memset(viz, 0,sizeof(viz));
memset(d, oo, sizeof(d));
memset(t, 0, sizeof(t));
d[source]=0;
while(1)
{
min=oo;u=-1;
for(i=source;i<=sink;++i)
if(!viz[i] && min>d[i]) min=d[i], u=i;
if(u==-1) break;
//printf("%d\n", u);
viz[u]=1;
for(i=source;i<=sink;++i)
{ if(cap[u][i])
{
min=d[u]+cost[u][i]+val[u]-val[i];
//printf("%d %d %d %d %d\n", min, d[i], d[u], val[u], val[i]);
if(min<d[i])
{
d[i]=min;
t[i]=u;
}
}
/*
if(cap[i][u])
{
min=d[i]-cost[u][i]+val[i]-val[u];
if(min<d[u])
{
d[u]=min;
t[u]=i;
}
}
*/
}
}
for(i==source;i<=sink;++i) val[i]+=d[i];
//for(i=source;i<=sink;++i) printf("%d ", d[i]);
//printf("\n");
if(d[sink]==oo) return 0;
for(i=sink;i!=source;i=t[i])
cap[t[i]][i]-=1,
cap[i][t[i]]+=1;
return 1;
}
int bellman()
{
int i,j;
memset(d, oo, sizeof(d));
memset(t, 0, sizeof(t));
d[source]=0;
int ok=1;
while(ok)
{
ok=0;
for(i=source;i<=sink;++i)
for(j=source;j<=sink;++j)
if(cap[i][j])
if(d[i]+cost[i][j]<d[j])
{
d[j]=d[i]+cost[i][j];
t[j]=i;
ok=1;
}
}
if(d[sink]==oo) return 0;
for(i=sink;i!=source;i=t[i])
cap[t[i]][i]-=1,
cap[i][t[i]]+=1;
return 1;
}
void maxflow()
{
int i, j;
while(bellman());//printf("da\n");
int sol=0;
for(i=1;i<=n;++i)
for(j=n+1;j<sink;++j)
if(!cap[i][j])sol+=cost[i][j];
freopen("cc.out","w",stdout);
printf("%d\n", sol);
}
int main()
{
read();
//printf("%d\n", n);
maxflow();
return 0;
}