#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#define LL long long
#define Lowbit(X) (X&(-X))
#define Lson (X<<1)
#define Rson (X<<1|1)
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(int i=A;i<=B;i++)
#define BOR(i,A,B) for(int i=A;i>=B;i--)
#define FOR_SIDE(i,A) for(int i=Head[A];i;i=Next[i])
#define INF 0x7fffffff
using namespace std;
const int MAXN=510;
int Total,Ans,Cop[MAXN][MAXN];
struct Node {
int Squ[MAXN][MAXN];
int Row,Line;
inline void Clean(int X) { FOR(i,1,Row) FOR(j,1,Line) Squ[i][j]=X; }
inline void Transpose() {
FOR(i,1,Row) FOR(j,1,Line) Cop[i][j]=Squ[i][j];
int Temp=Row; Row=Line; Line=Temp;
FOR(i,1,Row) FOR(j,1,Line) Squ[i][j]=Cop[j][i];
}
friend Node operator * (Node &A,Node &B) {
Node Temp;
Temp.Clean(0);
Temp.Row=A.Row; Temp.Line=B.Line;
FOR(i,1,Temp.Row) FOR(j,1,Temp.Line) FOR(k,1,A.Line)
Temp.Squ[i][j]+=A.Squ[i][k]*B.Squ[k][j];
return Temp;
}
friend Node operator - (Node &A,Node &B) {
Node Temp;
Temp.Clean(0);
Temp.Row=A.Row; Temp.Line=A.Line;
FOR(i,1,Temp.Row) FOR(j,1,Temp.Line)
Temp.Squ[i][j]=A.Squ[i][j]-B.Squ[i][j];
return Temp;
}
}A,B,C;
inline void Find() {
Node Res=A*B;
Res=Res-C;
Node Mine=A;
Mine.Transpose();
Ans=max(Ans,(Res*Mine).Squ[1][1]);
}
int main() {
srand(time(NULL));
scanf("%d",&Total);
B.Row=B.Line=C.Line=A.Line=Total;
C.Row=A.Row=1; A.Clean(1);
FOR(i,1,Total) FOR(j,1,Total) { scanf("%d",&B.Squ[i][j]); }
FOR(i,1,Total) { scanf("%d",&C.Squ[1][i]); }
Find();
FOR(i,1,1000) {
int Temp=(rand()%Total)+1;
A.Squ[1][Temp]^=1;
Find();
}
printf("%d\n",Ans);
system("pause");
return 0;
}