#include <bits/stdc++.h>
using namespace std;
inline int two(int n) { return 1 << n; }
inline int test(int n, int b) { return (n >> b) & 1; }
inline void set_bit(int& n, int b) { n |= two(b); }
inline void unset_bit(int& n, int b) { n &= ~two(b); }
inline int last_bit(int n) { return n & (-n); }
inline int ones(int n) {
  int res = 0;
  while (n && ++res) n -= n & (-n);
  return res;
}
const double pi = acos(-1);
template <class T>
inline T gcd(T a, T b) {
  if (a < 0) return gcd(-a, b);
  if (b < 0) return gcd(a, -b);
  return (b == 0) ? a : gcd(b, a % b);
}
const int MAX_N = 123;
int arr[MAX_N][11];
long long P[MAX_N][11];
int A[MAX_N];
int main() {
  int N;
  long long ans = INT_MIN;
  long long temp = 0;
  scanf("%d", &N);
  for (int i = 1; i < N + 1; i++) {
    for (int j = 1; j < 11; j++) {
      scanf("%d", &arr[i][j]);
    }
  }
  for (int i = 1; i < N + 1; i++) {
    for (int j = 0; j < 11; j++) {
      scanf("%lld", &P[i][j]);
    }
  }
  for (int i = 0; i < (1 << 10); i++) {
    memset(A, 0, sizeof A);
    temp = 0;
    bool flag = false;
    for (int j = 0; j < 10; j += 2) {
      if ((i & (1 << j) || i & (1 << (j + 1))) == 0) flag = true;
    }
    if (flag) continue;
    for (int j = 0; j < 10; j++) {
      if (i & (1 << j)) {
        for (int k = 1; k < N + 1; k++) {
          if (arr[k][j + 1] == 1) {
            A[k]++;
          }
        }
      }
    }
    for (int j = 1; j < N + 1; j++) {
      temp += P[j][A[j]];
    }
    ans = max(ans, temp);
  }
  printf("%lld\n", ans);
  return 0;
}
