#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<math.h>
#include<queue>
#include<deque>
#include<map>
#include<set>
#include<bitset>
using namespace std;
#define REP(i,m,n) for(int i=(int)m ; i < (int) n ; i++ )
#define rep(i,n) REP(i,0,n)
typedef long long ll;
typedef pair<int,int> pint;
const int inf=1e9+7;
const ll longinf=1LL<<60;
const ll mod=1e9+7;
int dx[4]={1,0,-1,0} , dy[4]={0,1,0,-1};
double dp[101010][20], a[20][20];
int n, m;
double rec(int mask, int x)
{
    if(dp[mask][x]!=-1)
        return dp[mask][x];
    if(x==m)
        return dp[mask][x] = 1;
    if(mask==0)
        return dp[mask][x] = 0;
    double ret = 0;
    rep(i,n){
        if(mask & 1<<i){
            double res = 0,pos=1.0;
            REP(j, x, m){
                res += rec(mask ^ (1 << i), j) * pos * (1.0 - a[i][j]);
                pos = pos * a[i][j];
            }
            res += pos;
            ret = max(res, ret);
        }
    }
    return dp[mask][x] = ret;
}
int main(){
    cin >> n >> m;
    rep(i,n)rep(j,m){
        cin >> a[i][j];
    }
    int all = 1 << n;
    rep(i, all) rep(j, m) dp[i][j] = -1;
    cout << fixed << setprecision(12) << rec(all - 1, 0) << endl;
    return 0;
}
