#include <bits/stdc++.h>
using namespace std;
template <typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p) {
  out << '(' << p.first << ", " << p.second << ')';
  return out;
}
template <typename T>
ostream& operator<<(ostream& out, vector<T> const& v) {
  long long l = v.size();
  for (long long i = 0; i < l - 1; i++) out << v[i] << ' ';
  if (l > 0) out << v[l - 1];
  return out;
}
template <typename T>
void trace(const char* name, T&& arg1) {
  cout << name << " : " << arg1 << "\n";
}
template <typename T, typename... Args>
void trace(const char* names, T&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cout.write(names, comma - names) << " : " << arg1 << " | ";
  trace(comma + 1, args...);
}
const long long N = (1LL << 7);
long double arr[N][N];
long long n;
long double dp[N][N];
long double dp2[N][N];
long long vis1[N][N], vis2[N][N];
pair<long long, long long> get_range(long long p, long long round, long long lp,
                                     long long rp) {
  long long mid = (lp + rp) / 2;
  if (p <= mid) {
    long long l = mid + 1, r = rp;
    return make_pair(l, r);
  } else {
    long long l = lp, r = mid;
    return make_pair(l, r);
  }
}
long double f2(long long p, long long r, long long lp, long long rp) {
  if (r == 0) {
    return 1.0;
  }
  if (vis2[p][r] != 0) {
    return dp2[p][r];
  }
  vis2[p][r] = 1;
  auto range = get_range(p, r, lp, rp);
  long long l = range.first;
  long long rr = range.second;
  long double ans = 0.0;
  long long mid = (lp + rp) / 2;
  for (long long i = l; i <= rr; i++) {
    if (i == p) continue;
    if (i <= mid) {
      ans = (ans + f2(p, r - 1, mid + 1, rp) * f2(i, r - 1, lp, mid) *
                       (arr[p][i] / 100.000));
    } else {
      ans = (ans + f2(p, r - 1, lp, mid) * f2(i, r - 1, mid + 1, rp) *
                       (arr[p][i] / 100.000));
    }
  }
  return dp2[p][r] = ans;
}
long double f(long long p, long long r, long long lp, long long rp) {
  if (r == 0) {
    return 0.0;
  }
  if (vis1[p][r] != 0) {
    return dp[p][r];
  }
  vis1[p][r] = 1;
  auto range = get_range(p, r, lp, rp);
  long long l = range.first;
  long long rr = range.second;
  long double ans = -1.0;
  long long mid = (lp + rp) / 2;
  for (long long i = l; i <= rr; i++) {
    if (i == p) continue;
    if (i <= mid) {
      ans = max(ans, f(p, r - 1, mid + 1, rp) + f(i, r - 1, lp, mid) +
                         f2(p, r, lp, rp) * (1LL << (r - 1)));
    } else {
      ans = max(ans, f(p, r - 1, lp, mid) + f(i, r - 1, mid + 1, rp) +
                         f2(p, r, lp, rp) * (1LL << (r - 1)));
    }
  }
  return dp[p][r] = ans;
}
int32_t main() {
  cin >> n;
  for (long long i = 1; i <= (1LL << n); i++) {
    for (long long j = 1; j <= (1LL << n); j++) {
      cin >> arr[i][j];
    }
  }
  long double ans = -1.0;
  for (long long i = 1; i <= (1LL << n); i++) {
    ans = max(ans, f(i, n, 1, (1LL << n)));
  }
  printf("%0.12Lf\n", ans);
  return 0;
}
