Codeforces 392(#290 Div1) B. Tower of Hanoi
問題
ハノイの塔がある。
通常のルールに加えて、軸iにささっている円盤を軸jに移動するときにcost[i][j]がかかる。
最初軸0にささっているn枚の円盤を、軸2に全て移動させるのにかかるコストの最小値を求めよ。
制約条件
n≦40
0≦cost[i][j]≦10000
方針
DPするだけ。
rec(n, i, j) := n枚の円盤をiからjにうつすコスト
あまってる軸をkとする。
n-1枚をkにうつしてn枚目をjにうつしてn-1枚をjに移す or
n-1枚をjにうつしてn枚目をkにうつしてn-1枚をiに移して、n枚目をjにうつして、n-1枚をjに移す
のうちコストの小さいほうを取ればいい。
ソースコード
int n, t[3][3]; ll dp[51][3][3]; ll rec(int n, int a, int b){ ll &res = dp[n][a][b]; if(res >= 0) return res; int c = 0; rep(i, 3) if(i != a && i != b) c = i; if(n == 1) return res = min(t[a][b], t[a][c] + t[c][b]); ll cost1 = rec(n-1, a, c) + t[a][b] + rec(n-1, c, b); ll cost2 = rec(n-1, a, b) + t[a][c] + rec(n-1, b, a) + t[c][b] + rec(n-1, a, b); res = min(cost1, cost2); return res; } int main(){ rep(i, 3) rep(j, 3) cin >> t[i][j]; cin >> n; memset(dp, -1, sizeof(dp)); cout << rec(n, 0, 2) << endl; return 0; }