#include <bits/stdc++.h>
using namespace std;
double p[20][20];
int n;
bool vis[18][1 << 18];
double mem[18][1 << 18];
double dp(int x, int mask) {
  if (mask == (1 << n) - 1) {
    if (x == 0)
      return 1;
    else
      return 0;
  }
  if (vis[x][mask] == true) return mem[x][mask];
  vis[x][mask] = true;
  double ans = 0;
  for (int i = 0; i < n; i++) {
    if ((mask >> i) & 1) continue;
    ans = max(ans, p[i][x] * dp(i, mask | (1 << i)) +
                       p[x][i] * dp(x, mask | (1 << i)));
  }
  return mem[x][mask] = ans;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      scanf("%lf", &p[i][j]);
    }
  }
  double ans = 0;
  for (int i = 0; i < n; i++) {
    ans = max(ans, dp(i, 1 << i));
  }
  printf("%.9lf\n", ans);
  return 0;
}
