#include <bits/stdc++.h>
using namespace std;
long long min(long long x, long long y) { return (x < y ? x : y); }
long long max(long long x, long long y) { return (x > y ? x : y); }
int keta(long long x) {
  if (x < 10) {
    return 1;
  } else {
    return keta(x / 10) + 1;
  }
}
int keta_wa(long long x) {
  if (x < 10) {
    return x;
  } else {
    return keta_wa(x / 10) + x % 10;
  }
}
int ctoi(char c) { return ((c >= '0' && c <= '9') ? c - '0' : 0); }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) {
  if (a < b) {
    swap(a, b);
  }
  return a * b / gcd(a, b);
}
bool isPrime(int n) {
  if (n < 2) {
    return false;
  }
  for (int i = 2; i < sqrt(n) + 1; i++) {
    if (n % i == 0) return false;
  }
  return true;
}
int main() {
  int N;
  cin >> N;
  int f[N][10];
  ;
  for (int i = 0, i_len = ((N)); i < i_len; ++i) {
    for (int j = 0, j_len = ((10)); j < j_len; ++j) {
      cin >> (f)[i][j];
    }
  };
  long long p[N][11];
  ;
  for (int i = 0, i_len = ((N)); i < i_len; ++i) {
    for (int j = 0, j_len = ((11)); j < j_len; ++j) {
      cin >> (p)[i][j];
    }
  };
  int count[N];
  long long r;
  long long r_max = -(1 << 9);
  for (int i = 1; i < pow(2, 10); i++) {
    ;
    for (int i = 0, i_len = ((N)); i < i_len; ++i) {
      (count)[i] = (0);
    };
    r = 0;
    int temp = i;
    for (int j = 0, j_len = (5); j < j_len; ++j) {
      if (temp & 1) {
        for (int k = 0, k_len = (N); k < k_len; ++k) {
          count[k] += f[k][j * 2];
        }
      }
      temp = temp >> 1;
      if (temp & 1) {
        for (int k = 0, k_len = (N); k < k_len; ++k) {
          count[k] += f[k][j * 2 + 1];
        }
      }
      temp = temp >> 1;
    }
    for (int i = 0, i_len = (N); i < i_len; ++i) {
      r += p[i][count[i]];
    }
    if (r_max < r) {
      r_max = r;
    }
  }
  cout << r_max << "\n";
}
