// Original C++ solution (slower):
#include<algorithm>

#include<complex>

#include<ctype.h>

#include<iomanip>

#include<iostream>

#include<map>

#include<math.h>

#include<numeric>

#include<queue>

#include<set>

#include<stack>

#include<stdio.h>

#include<string>

#include<string>

#include<vector>

#include<bitset>



using namespace std;

typedef long long ll;



#define FOR(i,a,b) for(int i=(a);i<(b);++i)

#define ALL(v) (v).begin(), (v).end()

#define p(s) cout<<(s)<<endl

#define p2(s, t) cout << (s) << " " << (t) << endl

#define pn(s) cout << (#s) << " " << (s) << endl

#define p_yes() p("Yes")

#define p_no() p("No")



const ll mod = 1e9 + 7;

const ll inf = 1e18;



// char to int

int ctoi(char c) {

	if (c >= '0' && c <= '9') {

		return c - '0';

	}

	return 0;

}



const int FLAG_NUM = 10;

// 1023 => 1111 1111

vector<int> num_to_flags(int x){

    stringstream ss;

    ss << static_cast<std::bitset<FLAG_NUM> >(x);

    string s = ss.str();

    vector<int> V(FLAG_NUM);

    FOR(i, 0, FLAG_NUM){

        V[i] = ctoi(s[i]);

    }

    return V;

}



void pV(vector<int> v){

    for(auto a : v){

        cout << a << " ";

    }

    cout << endl;

}



int main(){

    cin.tie(0);

    ios::sync_with_stdio(false);



    // input

    int N;

    cin >> N;



    vector<vector<int> > F(N);

    FOR(i, 0, N){

        FOR(j, 0, 10){

            int f;

            cin >> f;

            F[i].push_back(f);

        }

    }



    vector<vector<int> > P(N);

    FOR(i, 0, N){

        FOR(j, 0, 11){

            int p;

            cin >> p;

            P[i].push_back(p);

        }

    }



    ll max_profit = -inf;

    FOR(i, 1, 1024){

        auto flags = num_to_flags(i);



        ll profit_sum = 0;

        FOR(j, 0, N){

            auto tenpo = F[j];

            int both_work = 0;

            FOR(k, 0, 10){

                if(tenpo[k]==1 && flags[k]==1){

                    both_work++;

                }

            }

            int profit = P[j][both_work];

            profit_sum += profit;

        }

        max_profit = max(max_profit, profit_sum);

    }



    p(max_profit);

    

    return 0;

}

// Optimized solution to the same problem (faster):
#include<bits/stdc++.h>

using namespace std;

using ll = long long;

using VI = vector<ll>;

using VV = vector<VI>;

using VS = vector<string>;



// tourist set

template <typename A, typename B>

string to_string(pair<A, B> p);



template <typename A, typename B, typename C>

string to_string(tuple<A, B, C> p);



template <typename A, typename B, typename C, typename D>

string to_string(tuple<A, B, C, D> p);



string to_string(const string& s) {

  return '"' + s + '"';

}



string to_string(const char* s) {

  return to_string((string) s);

}



string to_string(bool b) {

  return (b ? "true" : "false");

}



string to_string(vector<bool> v) {

  bool first = true;

  string res = "{";

  for (int i = 0; i < static_cast<int>(v.size()); i++) {

    if (!first) {

      res += ", ";

    }

    first = false;

    res += to_string(v[i]);

  }

  res += "}";

  return res;

}



template <size_t N>

string to_string(bitset<N> v) {

  string res = "";

  for (size_t i = 0; i < N; i++) {

    res += static_cast<char>('0' + v[i]);

  }

  return res;

}



template <typename A>

string to_string(A v) {

  bool first = true;

  string res = "{";

  for (const auto &x : v) {

    if (!first) {

      res += ", ";

    }

    first = false;

    res += to_string(x);

  }

  res += "}";

  return res;

}



template <typename A, typename B>

string to_string(pair<A, B> p) {

  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";

}



template <typename A, typename B, typename C>

string to_string(tuple<A, B, C> p) {

  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";

}



template <typename A, typename B, typename C, typename D>

string to_string(tuple<A, B, C, D> p) {

  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";

}



void debug_out() { cerr << '\n'; }



template <typename Head, typename... Tail>

void debug_out(Head H, Tail... T) {

  cerr << " " << to_string(H);

  debug_out(T...);

}



#ifdef LOCAL

#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)

#else

#define debug(...) 42

#endif

// tourist set end



template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }



#define FOR(i,a,b) for(ll i=(a);i<(b);++i)

#define rep(i,b) FOR(i, 0, b)

#define ALL(v) (v).begin(), (v).end()

#define p(s) cout<<(s)<<'\n'

#define p2(s, t) cout << (s) << " " << (t) << '\n'

#define br() p("")

#define pn(s) cout << (#s) << " " << (s) << '\n'

#define p_yes() p("YES")

#define p_no() p("NO")

#define SZ(x) ((int)(x).size())



void no(){p_no(); exit(0);}

void yes(){p_yes(); exit(0);}



const ll mod = 1e9 + 7;

const ll inf = 1e18;



int main(){

    cin.tie(0);

    ios::sync_with_stdio(false);



    // input

    ll N; 

    cin >> N;



    VV F(N);

    rep(i, N){

      rep(j, 10){

        ll f; cin >> f;

        F[i].push_back(f);

      }

    }



    VV P(N);

    rep(i, N){

      rep(j, 11){

        ll f; cin >> f;

        P[i].push_back(f);

      }

    }

    



    ll ma = -inf;

    FOR(b, 1, 1<<10){

      VI A(10);

      rep(i, 10){

        if((b>>i&1) == 1){

          A[i]=1;

        }

      }

      // お店とのバッティング

      ll profit = 0;

      rep(i, N){

        ll cnt = 0;

        rep(j, 10){

          if(A[j]==1 && F[i][j]==1) cnt++;

        }

        // 利益

        profit += P[i][cnt];

        // debug(profit);

        

      }

      // if(profit==0){

      //   debug(A);

      //   debug(b);

      //   exit(0);

      // }

      chmax(ma, profit);

    }

    p(ma);

    

    return 0;

}

// Fastest known solution for this problem: