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

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(a) max((a),-(a))
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define repe(i,n) rep(i,(n)+1)
#define per(i,n) for(int i=(int)(n)-1;i>=0;i--)
#define pere(i,n) rep(i,(n)+1)
#define all(x) (x).begin(),(x).end()
#define SP <<" "<<
#define RET return 0
#define MOD 1000000007
#define INF 1000000000000000000

typedef long long LL;
typedef long double LD;

int main(){
  int n,m;
  cin >> m >> n;
  vector<vector<LD>> p(m,vector<LD>(n));
  for(int i=0;i<m;i++){
    for(int j=0;j<n;j++) cin >> p[i][j];
  }
  vector<vector<LD>> dp(n,vector<LD>(1<<m,0));
  LD tmp,pp;
  for(int i=n-1;i>=0;i--){
    for(int j=0;j<(1<<m);j++){
      dp[i][j]=0;
      for(int k=0;k<m;k++){
        if(j&(1<<k)){
          tmp=0,pp=1;
          for(int l=i;l<n;l++){
            tmp+=pp*(1-p[k][l])*dp[l][j-(1<<k)];
            pp*=p[k][l];
          }
          tmp+=pp;
          dp[i][j]=max(dp[i][j],tmp);
        }
      }
    }
  }
  cout << fixed << setprecision(12) << dp[0][(1<<m)-1] << endl;
  return 0;
}

