#include <bits/stdc++.h>
using namespace std;
template <class A, class B>
inline bool mina(A &first, B second) {
  return (first > second) ? (first = second, 1) : 0;
}
template <class A, class B>
inline bool maxa(A &first, B second) {
  return (first < second) ? (first = second, 1) : 0;
}
const int MAXR = 10;
const int MAXN = 70;
int N, R;
double win_p[MAXN][MAXN];
double dp[MAXN][MAXR];
vector<int> comp[MAXN][MAXR];
bool can_meet(int a, int b, int r) {
  for (int i = 0; (i) < (r); ++(i)) a /= 2;
  for (int i = 0; (i) < (r); ++(i)) b /= 2;
  return (a ^ 1) == b;
}
double max_score_game[MAXN][MAXR];
double solve(int winner, int round) {
  double res = 0;
  if (round == 0) return dp[winner][0];
  if (max_score_game[winner][round] > -0.5)
    return max_score_game[winner][round];
  for (int p : comp[winner][round]) {
    maxa(res, solve(winner, round - 1) + solve(p, round - 1));
  }
  res += dp[winner][round] * (1 << round);
  return max_score_game[winner][round] = res;
}
int main() {
  cin >> R;
  N = 1 << R;
  for (int i = 0; (i) < (N); ++(i)) {
    for (int j = 0; (j) < (N); ++(j)) {
      int first;
      cin >> first;
      win_p[i][j] = 1.0 * first / 100;
    }
  }
  for (int i = 0; (i) < (N); ++(i)) {
    for (int j = 0; (j) < (i); ++(j)) {
      for (int k = 0; (k) < (R); ++(k)) {
        if (can_meet(i, j, k)) {
          comp[i][k].push_back(j);
          comp[j][k].push_back(i);
        }
      }
    }
  }
  for (int i = 0; (i) < (N); ++(i)) dp[i][0] = win_p[i][i ^ 1];
  for (int i = 0; (i) < (N); ++(i))
    for (int j = 0; (j) < (R); ++(j)) max_score_game[i][j] = -1;
  for (int j = 1; j < R; j++) {
    for (int i = 0; (i) < (N); ++(i)) {
      dp[i][j] = 0;
      for (int p : comp[i][j]) {
        dp[i][j] += dp[p][j - 1] * win_p[i][p];
      }
      dp[i][j] *= dp[i][j - 1];
    }
  }
  double ans = 0;
  for (int i = 0; (i) < (N); ++(i)) {
    maxa(ans, solve(i, R - 1));
  }
  printf("%.9lf\n", ans);
  return 0;
}
