/*
*
*  Created By : Pritish Thakkar 
*  Hackerrank : ma5terdrag0n
*  CodeChef : solo_loser
*  Hackerearth : pritish9
*------------------------------------
*  OS : Ubuntu 16.04
*  Language : CPP14
*  Editor : Sublime Text 3
*  C++ compiler : g++
*
*/
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define inf 1000000007
#define fr first
#define sc second
#define eps 1e-9
#define sz(x) x.size()
#define sni(x) scanf("%d",&x)
#define snl(x) scanf("%lld", &x)
#define snc(x) scanf("%c", &c);
#define rep(n) for(int i = 0 ; i < n ;i ++)
#define repc(i, n) for(int i = 0 ; i < n ; i ++)
#define FOR(i, x, y) for(int i = x ; i < y ; i ++)
#define DEC(i, x, y) for(int i = x ; i >= y ; i --)
#define all(v) v.begin(), v.end()
#define min3(a, b, c) min(a, min(b,c))
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> ii;
typedef vector<ll> vi;
typedef vector<ii> vii;

bool isUpper(char c) {return (c >= 'A' && c <= 'Z');}
bool isLower(char c) {return (c >= 'a' && c <= 'z');}
bool iplpha(char c) {return (c >= 'A' && c <= 'Z')||(c >= 'a' && c <= 'z');}
bool isnum(char c){return (c >= '0' and c <= '9');}
bool isalnum(char c) {return (c >= 'A' && c <= 'Z')||(c >= 'a' && c <= 'z')||(c >= '0' && c <= '9');}
char toUpper(char c){return isUpper(c)?c:c-'a'+'A';}
char toLower(char c){return isLower(c)?c:c+'a'-'A';}
bool isvowel(char c){c = toLower(c); return (c == 'a' or c == 'e' or c == 'i' or c == 'i' or c == 'o' or c == 'u');}
template<typename t> t gcd(t a, t b){return ((b == 0) ? a : gcd(b, a%b));} 
template<typename t> t lcm(t a, t b){return (a * (b / gcd(a, b)));}
template <typename T> T modpow(T base, T exp, T modulus) {base %= modulus;T result = 1;while (exp > 0) {if (exp & 1) result = (result * base) % modulus;base = (base * base) % modulus;exp >>= 1;}return result;}
string toLowerCase(string s){rep(s.size()){if(!isLower(s[i])){s[i] = toLower(s[i]);}}return s;}
string toUpperCase(string s){rep(s.size()){s[i] = toUpper(s[i]);}return s;}
template<typename T> void cumulative(T *a, T *b, T n){rep(n){i ? b[i] = b[i-1] + a[i] : b[i] = a[i];}}
bool ispal(string s){ll lo, hi;lo = 0;hi = s.length()-1;while(lo <= hi){if(s[lo] != s[hi]){return 0;}lo++;--hi;}return 1;}
template<class T >string toString(T n){string v = "";while(n){v.pb(n % 10 + '0');n /= 10;}reverse(all(v));return v;}

//--------------------------------------------------------------------

void solve(){
  ll n;
  cin >> n;
  ll a[n][10];
  ll b[n] = {0};
  rep(n){
    repc(j, 10){
      cin >> a[i][j];
      b[i] += (a[i][j] == 1);
    }
  }  
  ll po[n][11];
  rep(n){
    repc(j, 11){
      cin >> po[i][j];
    }
  }

  ll ans = -inf;
  ll i;
  for( i = 1 ; i < (1 << 10) ; i ++){
    ll x = i;
    ll arr[10] = {0};
    // ll counter = 0;
    for(int j = 0 ; j < 10 ; j ++){
      arr[j] = (((1 << j) & x) > 0);
      // x >>= 1;
    } 
    // repc(j, 10){
    //   cout << arr[j] << " "; 
    // }
    // cout << endl;
    ll dip = 0;
    for(int j = 0 ;  j < n ; j ++){
      ll count = 0;
      for(int k = 0 ; k < 10; k ++){
        if(arr[k] == a[j][k] and a[j][k] == 1){
          count++;
        }
      }
      dip += po[j][count];
    }
    // cout << dip << endl;

    ans = max(ans, dip);
  }
  cout << ans << endl;

//   ll maxi[n] = {0};
//   rep(n){
//     maxi[i] = -inf;
//   }
//   ll ans = 0;
//   rep(n){
//     for(int j = 1 ; j <= b[i] ; j ++){
//       maxi[i] = max(maxi[i], po[i][j]);
//     }
//   }
//   bool pos = 0;
//   rep(n){
//     if(maxi[i] > 0){
//       pos = 1 ;
//       break;
//     }
//   }
//   if(pos){
//     bool ok = 0;
//     ll ans = 0;

//     rep(n){
//       if(maxi[i] < 0){
//         ans += max(po[i][0], maxi[i]);
//       }else{
//         if(maxi[i] >= po[i][0]){
//           ok = 1;
//           ans += maxi[i];
//         }
//       }
//     }
//     if(ok){
//       // cout << "bie\n";
//       rep(n){
//         if(maxi[i] > 0 and maxi[i] < po[i][0]){
//           ans += po[i][0];
//         }
//       }
//     }else{
//       // cout << "hi\n";
//       vii v;
//       rep(n){
//         if(maxi[i] > 0 and maxi[i] < po[i][0]){
//           v.pb(mp(po[i][0] - maxi[i], i));
//         }
//         // cout << po[i][0] << " " << maxi[i] << endl;
//       }
//       sort(all(v));
//       ll idx = v[0].sc;
//       ans += maxi[idx];
// // 
//       // cout << idx << " "<< v[0].fr << endl;
//       rep(n){
//         if(i != idx and maxi[i] > 0 and maxi[i] < po[i][0]){
//           ans += po[i][0];
//         }
//       }
//     }
    
//     cout << ans << endl;
//   }else{
//     {
//       ll ana = 0;
//       ll mausi = -inf;
//       ll id = 0;
//       rep(n){
//         if(mausi < maxi[i]){
//           id = i;
//           mausi = maxi[i];
//         }
//       }
//       ana += maxi[id];
//       // cout << maxi[id] << endl;
//       rep(n){
//         if(i  !=  id ){
//           ana += max(maxi[i], po[i][0]);
//         }
//       }
//       cout << ana << endl;
//       return ;
//     }
//   }
}



int main(){
    std::ios::sync_with_stdio(0);
    // int start = clock();
    #ifdef ONLINE_JUDGE
    #else
      //freopen("input.in" , "r" , stdin);
      // freopen("output.txt", "w", stdout);
    #endif
    solve();
    // cout << n;
    // int stop = clock();
    // cout << (stop - start) / 1000.0000<< endl;
}





Measured memory_bytes: 256