奇怪的漢諾塔
阿新 • • 發佈:2020-08-09
題目來源:演算法競賽進階指南
題目標籤:遞迴,動態規劃
題目連結:https://www.acwing.com/problem/content/98/
思路:1.先用動態規劃考慮三塔問題,狀態轉移方程為:d[ i ]=d[i - 1] * 2 + 1
(當前圓盤等於把當前圓盤上面的圓盤先移動到第二個塔,最後一個圓盤移動到第三個塔,上面的圓盤移動到第三個塔)
2.從三塔擴充套件到四塔:把當前塔上面的 j 個塔移動到某一個塔上(四塔問題), 把當前剩餘的移動到最後一個塔上(三塔問題), 將前面 j 個塔移動到最後一個塔上(四塔問題)
狀態轉移方程:f[ i ]=min( f[ i ], f[ j ] * 2 + d[ n - j ])
程式碼:
#include <bits/stdc++.h> using namespace std; int main() { int d[15], f[15]; d[1] = 1; for(int i = 2; i <= 12; i++) { d[i] = 1 + d[i - 1] * 2; } memset(f, 0x3f, sizeof f); f[0] = 0; for(int i = 1; i <= 12; i++) for(int j = 0; j < i; j++) f[i] = min(f[i], f[j] * 2 + d[i - j]); for(int i = 1; i <= 12; i++) cout << f[i] << endl; return 0; }