#include <bits/stdc++.h>
#define N 16 
using namespace std;
int m,n;
double neko[N][N];
double dfs(int pos,int k,int bit);
double calc(int pos,int bit){
  static int used[N][1<<N]={};
  static double mem[N][1<<N];
  if(used[pos][bit]++) return mem[pos][bit];
  double mx = 0;
  for(int i=0;i<m;i++)if(((bit>>i)&1)==0)mx=max(mx,dfs(pos,i,bit));
  return mem[pos][bit] = mx;
}

double dfs(int pos,int k,int bit){
  if(pos==n) return 1;
  double p = neko[k][pos];
  return p*dfs(pos+1,k,bit) + (1-p)*calc(pos,bit|(1<<k));
}


int main(){
  cin>>m>>n;
  for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)cin>>neko[i][j];
  
  double ans=0;
  for(int i=0;i<m;i++) ans=max(ans,dfs(0,i,0));
  printf("%.10f\n",ans);
  return 0;
}