#include<bits/stdc++.h>
using namespace std;
int n,mat[25],la[25],lb[25],w[25][25],delta;
bool va[25],vb[25];
bool dfs(int x)
{
va[x]=1;
for(int y=1;y<=n;y++)
{
if(!vb[y])
{
if(la[x]+lb[y]==w[x][y])
{
vb[y]=1;
if(!mat[y]||dfs(mat[y]))
{
mat[y]=x;
return 1;
}
}
}
else
{
if(la[x]+lb[y]-w[x][y]>0)
{
delta=min(delta,la[x]+lb[y]-w[x][y]);
}
}
}
return 0;
}
void km()
{
for(int i=1;i<=n;i++)
{
while(1)
{
delta=1<<30;
memset(va,0,sizeof(va));
memset(vb,0,sizeof(vb));
if(dfs(i)) break;
for(int j=1;j<=n;j++)
{
if(va[j]) la[j]-=delta;
if(vb[j]) lb[j]+=delta;
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&w[i][j]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int t;
scanf("%d",&t);
w[j][i]*=t;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
la[i]=max(la[i],w[i][j]);
}
}
km();
int ans=0;
for(int i=1;i<=n;i++)
{
ans+=w[mat[i]][i];
}
printf("%d",ans);
return 0;
}