#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
constexpr ll MOD = ll(1e9+7);

int n, m;
double dp[17][16][1<<16];  // dp[i][j][S] i番目より後の敵を倒して、現在ねこjを派遣しており、やられたねこの集合がSの最大確率
double dp2[17][1<<16];  // dp2[i][S] i番目以降の敵を倒して、やられたねこの集合がSである最大確率
double w[17][17];

void chmax(double &a, double b){
    a = max(a, b);
}

int main(){
    cin >> m >> n;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cin >> w[i][j];
        }
    }
    for(int i=0;i<m;i++){
        for(int S=0;S<1<<m;S++){
            dp[n][i][S] = 1.0;
        }
    }
    for(int i=n-1;i>=0;i--){
        for(int S=(1<<m)-2;S>=0;S--){
            for(int j=0;j<m;j++){
                if((S>>j)&1) continue;
                dp[i][j][S] = dp[i+1][j][S] * w[j][i] + dp2[i][S|(1<<j)] * (1-w[j][i]);
                chmax(dp2[i][S], dp[i][j][S]);
            }
        }
    }

    double ans = dp2[0][0];
    printf("%.12lf\n", ans);
    return 0;
}
