1. 程式人生 > 實用技巧 >奇怪的漢諾塔

奇怪的漢諾塔

題目來源:演算法競賽進階指南

題目標籤:遞迴,動態規劃

題目連結: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; }