1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<queue>
  7 using namespace std;
  8 #define Maxn 1100
  9 #define INF 0xfffffff
 10 
 11 int mymin(int x,int y) {return x<y?x:y;}
 12 
 13 int a[Maxn],w[Maxn][Maxn];
 14 
 15 struct node
 16 {
 17     int x,y,f,next,o;
 18 }t[Maxn*Maxn*10];
 19 int len,first[Maxn];
 20 
 21 void ins(int x,int y,int f)
 22 {
 23     t[++len].x=x;t[len].y=y;t[len].f=f;
 24     t[len].next=first[x];first[x]=len;t[len].o=len+1;
 25     t[++len].x=y;t[len].y=x;t[len].f=0;
 26     t[len].next=first[y];first[y]=len;t[len].o=len-1;
 27 }
 28 
 29 int st,ed;
 30 int dis[Maxn];
 31 queue<int > q;
 32 bool bfs()
 33 {
 34     for(int i=1;i<=ed;i++) dis[i]=-1;
 35     while(!q.empty()) q.pop();
 36     dis[st]=0;q.push(st);
 37     while(!q.empty())
 38     {
 39         int x=q.front();
 40         for(int i=first[x];i;i=t[i].next) if(t[i].f>0)
 41         {
 42             int y=t[i].y;
 43             if(dis[y]==-1)
 44             {
 45                 dis[y]=dis[x]+1;
 46                 q.push(y);
 47             }
 48         }
 49         q.pop();
 50     }
 51     if(dis[ed]==-1) return 0;
 52     return 1;
 53 }
 54 
 55 int ffind(int x,int flow)
 56 {
 57     if(x==ed) return flow;
 58     int now=0;
 59     for(int i=first[x];i;i=t[i].next) if(t[i].f>0)
 60     {
 61         int y=t[i].y;
 62         if(dis[y]==dis[x]+1)
 63         {
 64             int a=ffind(y,mymin(flow-now,t[i].f));
 65             t[i].f-=a;
 66             t[t[i].o].f+=a;
 67             now+=a;
 68         }
 69         if(now==flow) break;
 70     }
 71     if(now==0) dis[x]=-1;
 72     return now;
 73 }
 74 
 75 void output()
 76 {
 77     for(int i=1;i<=len;i+=2)
 78     {
 79         printf("%d -> %d %d\n",t[i].x,t[i].y,t[i].f);
 80     }printf("\n");
 81 }
 82 
 83 int ans;
 84 void max_flow()
 85 {
 86     while(bfs())
 87     {
 88         ans-=ffind(st,INF);
 89     // output();
 90     // while(1);
 91     }
 92 }
 93 
 94 int s[Maxn];
 95 
 96 int main()
 97 {
 98     int n;
 99     scanf("%d",&n);
100     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
101     ans=0;
102     for(int i=1;i<=n;i++)
103     {
104         s[i]=0;
105         for(int j=1;j<=n;j++)
106         {
107             scanf("%d",&w[i][j]);
108             s[i]+=w[i][j];
109             ans+=w[i][j];
110         }
111     }
112      
113     len=0;
114     memset(first,0,sizeof(first));
115     st=n+1;ed=st+1;
116     for(int i=1;i<=n;i++) ins(st,i,a[i]);
117     for(int i=1;i<=n;i++)
118      for(int j=i+1;j<=n;j++) {ins(i,j,2*w[i][j]);ins(j,i,2*w[i][j]);}
119     for(int i=1;i<=n;i++) ins(i,ed,s[i]);
120     // output();
121     max_flow();
122     printf("%d\n",ans);
123     return 0;
124 }