1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream>
 
int n ;
double data [ 15 ][ 15 ] , check [ 15 ][ 1 << 15 ] ;
 
double min ( double a , double b ) {
    if ( a > b ) return b ;
    return a ;
}
 
double TSP ( int x , int state )
{
    if ( state == ( 1 << n ) - 1 ) return 0 ;
    if ( check [ x ][ state ] != -1 ) return check [ x ][ state ] ;
    check [ x ][ state ] = 987654321 ;
    for ( int i = 0 ; i < n ; i ++ ) {
        if ( ( state & ( 1 << i ) ) == false )
            check [ x ][ state ] = min ( check [ x ][ state ] , data [ x ][ i ] + TSP ( i , ( state | ( 1 << i ) ) ) ) ;
    }
    return check [ x ][ state ] ;
}
 
int main()
{
//    freopen ( "input.txt" , "r" ,stdin );
    int CASE ;
    scanf ( "%d" , & CASE ) ;
    for ( ; CASE ; CASE -- )
    {
        scanf ( "%d" , & n ) ;
        int i , j ;
        for ( i = 0 ; i < n ; i ++ ) for ( j = 0 ; j < ( 1 << n ) ; j ++ ) check [ i ][ j ] = -1 ;
        for ( i = 0 ; i < n ; i ++ ) for ( j = 0 ; j < n ; j ++ ) scanf ( "%lf" , & data [ i ][ j ] ) ;
        double result = 987654321 ;
        for ( i = 0 ; i < n ; i ++ )
            result = min ( result , TSP ( i , ( 1 << i ) ) ) ;
        printf ( "%.10lf\n" , result ) ;
    }
    return 0;
}
cs



이 오징어가 혹시?