#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n,m;
double dp[1<<16][16];
double data[17][17];

double memo(int bit,int v){
	if(v==n)return 1.0;
	if(bit==0)return 0.0;
	if(dp[bit][v]>=0.0)return dp[bit][v];
	double res=0.0;
	for(int i=0;i<m;i++){
		if(!(bit>>i & 1))continue;
		double sum=0.0,win=1.0;
		int lbit=bit-(1<<i);
		for(int j=v;j<n;j++){
			sum+=memo(lbit,j)*win*(1-data[i][j]);
			win*=data[i][j];
		}
		sum+=win;
		res=max(res,sum);
	}
	return dp[bit][v]=res;
}

int main(void){
	scanf("%d %d",&m,&n);
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			scanf("%lf",&data[i][j]);
		}
	}
	memset(dp,-1,sizeof(dp));
	double res=0.0;
	printf("%.10f\n",memo((1<<m)-1,0));
	return 0;
}