#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define SIZE 25
int map[SIZE][SIZE];
int n, x, y;
int maxVal;
queue<int> que;
void problemIn() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
}
}
}
void copy_map(int(*a)[SIZE], int(*b)[SIZE]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
b[i][j] = a[i][j];
}
}
}
void merge(int d) {
if (d == 0) {
for (int i = 0; i < n; i++) {
for (int j = n - 1; j >= 0; j--) {
if (map[i][j] != 0) que.push(map[i][j]);
map[i][j] = 0;
}
int idx = n - 1;
int que_data;
while (!que.empty()) {
que_data = que.front();
que.pop();
if (map[i][idx] == 0) map[i][idx] = que_data;
else if (map[i][idx] == que_data) {
map[i][idx] *= 2;
idx--;
}
else {
idx--;
map[i][idx] = que_data;
}
}
}
}
else if (d == 1) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] != 0) que.push(map[i][j]);
map[i][j] = 0;
}
int idx = 0;
int que_data;
while (!que.empty()) {
que_data = que.front();
que.pop();
if (map[i][idx] == 0) map[i][idx] = que_data;
else if (map[i][idx] == que_data) {
map[i][idx] *= 2;
idx++;
}
else map[i][++idx] = que_data;
}
}
}
else if (d == 2) {
for (int j = 0; j < n; j++) {
for (int i = n - 1; i >= 0; i--) {
if (map[i][j] != 0) que.push(map[i][j]);
map[i][j] = 0;
}
int idx = n - 1;
int que_data;
while (!que.empty()) {
que_data = que.front();
que.pop();
if (map[idx][j] == 0) map[idx][j] = que_data;
else if (map[idx][j] == que_data) map[idx--][j] *= 2;
else map[--idx][j] = que_data;
}
}
}
else if (d == 3) {
for (int j = 0; j < n; j++) {
for (int i = 0; i < n; i++) {
if (map[i][j] != 0) que.push(map[i][j]);
map[i][j] = 0;
}
int idx = 0;
int que_data;
while (!que.empty()) {
que_data = que.front();
que.pop();
if (map[idx][j] == 0) map[idx][j] = que_data;
else if (map[idx][j] == que_data) map[idx++][j] *= 2;
else map[++idx][j] = que_data;
}
}
}
}
void dfs(int depth) {
if (depth == 5) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
maxVal = max(maxVal, map[i][j]);
}
}
return;
}
int map_store[SIZE][SIZE];
copy_map(map, map_store);
for (int i = 0; i < 4; i++) {
merge(i);
dfs(depth + 1);
copy_map(map_store, map);
}
}
int main(void) {
problemIn();
dfs(0);
cout << maxVal << endl;
return 0;
}