AOJ 2254 - Fastest Route

やるだけ.

解法

bitDP.

コード

たまにはループで.

#include <cstdio>
#include <algorithm>

int T[16][17], T_[1<<16][16];
int dp[1<<16][16];

int main(){
    int N;
    while(scanf("%d", &N), N){
        for(int i=0;i<N;i++){
            for(int j=0;j<=N;j++){
                scanf("%d", &T[i][j]);
            }
        }

        for(int i=0;i<1<<N;i++){
            for(int j=0;j<N;j++){
                int mn = T[j][0];
                for(int k=0;k<N;k++){
                    if(!(i >> k & 1)){continue;}
                    mn = std::min(mn, T[j][k+1]);
                }
                T_[i][j] = mn;
            }
        }

        for(int i=0;i<1<<N;i++){
            for(int j=0;j<N;j++){
                dp[i][j] = i == 0 ? 0 : 1001001001;
            }
        }

        for(int i=0;i<1<<N;i++){
            for(int j=0;j<N;j++){
                for(int k=0;k<N;k++){
                    if(i >> k & 1){continue;}
                    int ni = i | (1 << k);
                    dp[ni][k] = std::min(dp[ni][k], dp[i][j] + T_[i][k]);
                }
            }
        }

        int res = 1001001001;
        for(int i=0;i<N;i++){
            res = std::min(res, dp[(1<<N)-1][i]);
        }

        printf("%d\n", res);
    }
}