func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   T in() {     char ch;     T n = 0;     bool ng = false;     while (1) {       ch = getchar();       if (ch ==  - ) {         ng = true;         ch = getchar();         break;       }       if (ch >=  0  && ch <=  9 ) break;     }     while (1) {       n = n * 10 + (ch -  0 );       ch = getchar();       if (ch <  0  || ch >  9 ) break;     }     return (ng ? -n : n);   }   template <typename T>   inline T POW(T B, T P) {     if (P == 0) return 1;     if (P & 1)       return B * POW(B, P - 1);     else       return (POW(B, P / 2) * POW(B, P / 2));   }   template <typename T>   inline T Gcd(T a, T b) {     if (a < 0) return Gcd(-a, b);     if (b < 0) return Gcd(a, -b);     return (b == 0) ? a : Gcd(b, a % b);   }   template <typename T>   inline T Lcm(T a, T b) {     if (a < 0) return Lcm(-a, b);     if (b < 0) return Lcm(a, -b);     return a * (b / Gcd(a, b));   }   long long Bigmod(long long base, long long power, long long MOD) {     long long ret = 1;     while (power) {       if (power & 1) ret = (ret * base) % MOD;       base = (base * base) % MOD;       power >>= 1;     }     return ret;   }   bool isVowel(char ch) {     ch = toupper(ch);     if (ch ==  A  || ch ==  U  || ch ==  I  || ch ==  O  || ch ==  E )       return true;     return false;   }   template <typename T>   long long int isLeft(T a, T b, T c) {     return (a.x - b.x) * (b.y - c.y) - (b.x - c.x) * (a.y - b.y);   }   long long ModInverse(long long number, long long MOD) {     return Bigmod(number, MOD - 2, MOD);   }   bool isConst(char ch) {     if (isalpha(ch) && !isVowel(ch)) return true;     return false;   }   int toInt(string s) {     int sm;     stringstream second(s);     second >> sm;     return sm;   }   int n;   double a[19][19];   double dp[19][(1 << 18) + 10];   int vs[19][(1 << 18) + 10];   int lm;   double Solve(int w, int m) {     if (m == lm) {       if (w == 0) return 1.0;       return 0.0;     }     double &res = dp[w][m];     if (vs[w][m]) return res;     vs[w][m] = 1;     res = 0.0;     for (int i = 0; i < n; i++) {       if ((m & (1 << i)) == 0) {         double aa = a[w][i] * Solve(w, (m | (1 << i)));         aa += a[i][w] * Solve(i, (m | (1 << i)));         res = max(res, aa);       }     }     return res;   }   int main() {     cin >> n;     lm = (1 << n) - 1;     for (int i = 0; i < n; i++)       for (int j = 0; j < n; j++) cin >> a[i][j];     if (n == 1) {       printf( 1.00 n );       return 0;     } else if (n == 2) {       printf( %.10lf n , a[0][1]);       return 0;     }     double ans = 0.0;     for (int j = 0; j < n; j++) {       for (int i = j + 1; i < n; i++) {         double aa = a[j][i] * Solve(j, (1 << j) | (1 << i));         aa += a[i][j] * Solve(i, (1 << i) | (1 << j));         ans = max(aa, ans);       }     }     printf( %.10lf n , ans);     return 0;   }   