// AtCoder Beginner Contest 080 2017/12/03

#include <iostream>
using namespace std;

int ans = -(1 << 30);
using ushort = unsigned short;
// 自分の店を開くか
ushort my_shop = 0;
// 店の数
int n;
// ほかの店の開店時間
ushort others[110];
// ほかの店との兼ね合いによる利益
int profit[110][11];

void update(int n);
void calc_profit();
int pop_count(ushort a);
int pop_count(ushort a, ushort b);

int main(){
	// 店の数
	cin >> n;
	int input;
	// ほかの店の開店時間
	for(int j = 0; j < n; j++){
		others[j] = 0;
	for(int i = 0; i < 10; i++){
		cin >> input;
		others[j] |= (input << i);
	}
	}
	// 開店時間の重複数と利益
	for(int j = 0; j < n; j++){
	for(int i = 0; i < 11; i++){
		cin >> input;
		profit[j][i] = input;
	}
	}
	update(0);
	cout << ans << endl;
	return 0;
}

void update(int n){
	if(n == 10){
		calc_profit();
		return;
	}else{
		// この時間帯に店を開く場合
		my_shop |= (1 << n);  update(n + 1);
		// この時間帯に店を開かない場合
		my_shop &= ~(1 << n); update(n + 1);
	}
}

inline int max(int a, int p){
	return a < p? p: a;
}
void calc_profit(){
	int p = 0
	for(int i = 0; i < n; i++){
		p += profit[i][pop_count(my_shop, others[i])];
	}
	ans = max(ans, p);
}

int pop_count(ushort a) {
	a = (a & 0x5555) + ((a >> 1) & 0x5555);// 0101 0101 0101 0101
	a = (a & 0x3333) + ((a >> 2) & 0x3333);// 0011 0011 0011 0011
	a = (a & 0x0f0f) + ((a >> 4) & 0x0f0f);// 0000 1111 0000 1111
	a = (a & 0x00ff) + ((a >> 8) & 0x00ff);// 0000 0000 1111 1111
	return a;
}
int pop_count(ushort a, ushort b) {
	return pop_count(a & b);
}
