0w1

LHPC 2016 pC. 跳格子 ( DP )

f:id:h0rnet:20160820212141p:plain
f:id:h0rnet:20160820212231p:plain
沒有什麼玄機的 DP,注意要 long long。

void solve(){
    int N, M; cin >> N >> M;
    vvi C( 3, vi( 3 ) );
    for( int i = 0; i < 3; ++i )
        for( int j = 0; j < 3; ++j )
            cin >> C[ i ][ j ];
    vvi G( N, vi( M ) );
    vvl dp( N, vl( M ) );
    for( int i = 0; i < N; ++i )
        for( int j = 0; j < M; ++j )
            cin >> G[ i ][ j ];
    for( int i = 0; i < N; ++i )
        for( int j = 0; j < M; ++j ){
            if( j + 1 < M )
                upmax( dp[ i ][ j + 1 ], dp[ i ][ j ] + C[ G[ i ][ j ] ][ G[ i ][ j + 1 ] ] );
            if( i + 1 < N )
                upmax( dp[ i + 1 ][ j ], dp[ i ][ j ] + C[ G[ i ][ j ] ][ G[ i + 1 ][ j ] ] );
            if( i + 1 < N and j + 1 < M )
                upmax( dp[ i + 1 ][ j + 1 ], dp[ i ][ j ] + C[ G[ i ][ j ] ][ G[ i + 1 ][ j + 1 ] ] );
        }
    cout << dp[ N - 1 ][ M - 1 ] << endl;
}