#include <bits/stdc++.h>
using namespace std;
long long bigmod(long long b, long long p, long long m) {
  if (p == 0) return 1;
  long long my = bigmod(b, p / 2, m);
  my *= my;
  my %= m;
  if (p & 1) my *= b, my %= m;
  return my;
}
long long setb(long long n, long long pos) { return n = n | (1 << pos); }
long long resb(long long n, long long pos) { return n = n & ~(1 << pos); }
bool checkb(long long n, long long pos) { return (bool)(n & (1 << pos)); }
long long t, n;
long long ara[70][70];
double w[70][70], p[70][10], pp[70][10];
long long get_first(long long idx, long long span) {
  long long my = idx / span;
  if (idx % span) my++;
  return (my - 1) * span + 1;
}
double go(long long idx, long long round) {
  double my = p[idx][round - 1];
  long long span = 1 << (round - 1);
  long long l = get_first(idx, span);
  long long r = l + span - 1;
  long long mid = (l + r) / 2;
  double ret = 0.0;
  if (idx <= mid) {
    for (long long i = mid + 1; i <= r; i++) {
      ret += p[i][round - 1] * w[idx][i];
    }
  } else {
    for (long long i = l; i <= mid; i++) {
      ret += p[i][round - 1] * w[idx][i];
    }
  }
  return my * ret;
}
void prework() {
  long long i;
  for (i = 1; i <= t; i++) p[i][1] = 1.0, pp[i][1] = 1.0;
  for (long long round = 2; round <= n + 1; round++) {
    for (i = 1; i <= t; i++) {
      p[i][round] = go(i, round);
    }
  }
}
double dp[70][10];
bool visit[70][10];
double F(long long cur, long long round) {
  if (round == 1) return 0.0;
  if (visit[cur][round]) return dp[cur][round];
  long long span = 1 << (round - 1);
  long long l = get_first(cur, span);
  long long r = l + span - 1;
  long long mid = (l + r) / 2;
  long long score = span >> 1;
  double ret = 0.0;
  if (cur <= mid) {
    double tot = 0.0;
    for (long long i = mid + 1; i <= r; i++) {
      tot += p[cur][round - 1] * p[i][round - 1] * w[cur][i] * score;
    }
    for (long long i = mid + 1; i <= r; i++) {
      ret = max(ret, tot + F(cur, round - 1) + F(i, round - 1));
    }
  } else {
    double tot = 0.0;
    for (long long i = l; i <= mid; i++) {
      tot += p[cur][round - 1] * p[i][round - 1] * w[cur][i] * score;
    }
    for (long long i = l; i <= mid; i++) {
      ret = max(ret, tot + F(cur, round - 1) + F(i, round - 1));
    }
  }
  visit[cur][round] = 1;
  return dp[cur][round] = ret;
}
int main() {
  long long i, j;
  scanf("%lld", &n);
  t = 1 << n;
  for (i = 1; i <= t; i++)
    for (j = 1; j <= t; j++) scanf("%lld", &ara[i][j]);
  for (i = 1; i <= t; i++)
    for (j = 1; j <= t; j++) w[i][j] = (double)ara[i][j] / 100.0;
  prework();
  double ret = 0;
  for (i = 1; i <= t; i++) ret = max(ret, F(i, n + 1));
  printf("%.15f\n", ret);
  return 0;
}
