0w1

CFR 580 D. Kefa and Dishes ( bit DP )

Problem - D - Codeforces
I thought this resembled quite a lot with this problem.
What we really have to do is to perform dynamic programming on:
dp[ S ][ i ] : the value of having each element in set S eaten and i'th as the last

int bit_count( int x ){
    return x ? bit_count( x >> 1 ) + ( x & 1 ) : 0;
}

void solve(){
    int N, M, K; cin >> N >> M >> K;
    vi A( N );
    for( int i = 0; i < N; ++i )
        cin >> A[ i ];
    map< pii, int > rule;
    for( int i = 0; i < K; ++i ){
        int x, y, c; cin >> x >> y >> c;
        --x, --y;
        rule[ pii( x, y ) ] = c;
    }
    vvl dp( 1 << N, vl( N, -( 1LL << 60 ) ) );
    for( int i = 0; i < N; ++i )
        dp[ 1 << i ][ i ] = A[ i ];
    for( int i = 1; i < 1 << N; ++i )
        for( int j = 0; j < N; ++j ) if( i >> j & 1 )
            for( int k = 0; k < N; ++k ) if( not ( i >> k & 1 ) ){
                ll nv = dp[ i ][ j ] + A[ k ];
                if( rule.count( pii( j, k ) ) ) nv += rule[ pii( j, k ) ];
                upmax( dp[ i | 1 << k ][ k ], nv );
            }
    ll ans = 0;
    for( int i = 1; i < 1 << N; ++i )
        for( int j = 0; j < N; ++j ) if( i >> j & 1 )
            if( bit_count( i ) == M )
                upmax( ans, dp[ i ][ j ] );
    cout << ans << endl;
}