#include <iostream>
#include <cstring>
using namespace std;
int N,p[25][25],q,w[25][25],l[25],r[25],minn;
int visx[25],visy[25];
int match[25];
bool dfs(int u){
visx[u] = 1;
for(int i = 1;i <= N;i++){
if(!visy[i]){
visy[i] = 1;
int ans = l[u] + r[i] - w[u][i];
if(ans == 0){
if(!match[i] || dfs(match[i])){
match[i] = u;
return 1;
}
}
else if(ans > 0) minn = min(minn,ans);
}
}
return 0;
}
void KM(){
for(int i = 1;i <= N;i++){
while(1){
minn = 0x3f3f3f3f;
memset(visx,0,sizeof visx);
memset(visy,0,sizeof visy);
if(dfs(i)) break;
for(int j = 1;j <= N;j++)
if(visx[j]) l[j] -= minn;
for(int j = 1;j <= N;j++)
if(visy[j]) r[j] += minn;
}
}
}
int main(){
cin >> N;
for(int i = 1;i <= N;i++)
for(int j = 1;j <= N;j++)
cin >> w[i][j];
for(int i = 1;i <= N;i++)
for(int j = 1;j <= N;j++){
cin >> q;
w[j][i] *= q;
}
for(int i = 1;i <= N;i++)
for(int j = 1;j <= N;j++)
l[i] = max(l[i],w[i][j]);
KM();
int sum = 0;
for(int i = 1;i <= N;i++)
sum += w[match[i]][i];
cout << sum << endl;
return 0;
}