#include <bits/stdc++.h>
using namespace std;
const int MaxN = int(2e6) + 256;
const long long INF = (long long)(1e18);
const int inf = (int)(1e9);
const int mod = (int)(1e9) + 7;
const double pi = 3.1415926535897932384626433832795;
long long n, m, ans;
double a[111][111], b[MaxN];
long double d[111][111][111], dp[111][111][111];
bool used[111][111][111];
long double rec(int win, int l, int r) {
  if (l == r) {
    return 1;
  }
  if (win < l || win > r) return 0;
  if (used[win][l][r]) return d[win][l][r];
  used[win][l][r] = 1;
  long double ans = 0;
  int m = (l + r) / 2;
  for (int j = l; j <= r; j++) {
    if (j == win) continue;
    if (win <= m && win >= l) {
      ans += rec(win, l, m) * rec(j, m + 1, r) * (a[win][j] / 100.0);
    } else {
      ans += rec(j, l, m) * rec(win, m + 1, r) * (a[win][j] / 100.0);
    }
  }
  long double Y = 0;
  for (int j = l; j <= r; j++) {
    if (j == win) continue;
    if (win <= m && win >= l) {
      Y = max(Y, dp[j][m + 1][r]);
    } else {
      Y = max(Y, dp[j][l][m]);
    }
  }
  double x = (r - l + 1) / 2;
  if (win <= m) {
    dp[win][l][r] = ans * x + dp[win][l][m] + Y;
  } else
    dp[win][l][r] = ans * x + dp[win][m + 1][r] + Y;
  d[win][l][r] = ans;
  return ans;
}
int main() {
  cin >> n;
  for (int i = 0; i < (1 << n); i++) {
    for (int j = 0; j < (1 << n); j++) {
      cin >> a[i][j];
    }
  }
  long double ans = 0;
  for (int i = 0; i < (1 << n); i++) {
    rec(i, 0, (1 << n) - 1);
    ans = max(ans, dp[i][0][(1 << n) - 1]);
  }
  cout << setprecision(10) << fixed << ans;
  return 0;
}
