96.奇怪的汉诺塔

原题链接:96. 奇怪的汉诺塔


解题思路:

首先考虑n个盘中3座塔的经典问题,设d[n]表示求解改n盘3塔问题的最少步数,显然有d[n]=2*d[n-1]+1,既把前n-1个盘子从A柱移动到B柱,然后把第n个盘子从A柱移动到C柱,最后把前n-1个盘子从B柱移动到C柱。
回到本题,设f[n]表示求解n盘4塔问题的最小步数,则:
f[n] = min~i<=i<n~{2*f[i]+d[n-1]}
其中f[1]=1。上式的含义是,先把i个盘子在4塔模式下移动到B柱,然后把n-i个盘子在3塔模式下移动到D柱,把最后i个盘子在4塔模式下移动到D柱。考虑到所有可能的i取最小值,就有了上述递推公式。
在时间复杂度可以接受的前提下,上述做法可以推广到n盘m塔的计算。

样例代码

#include<bits/stdc++.h>
using namespace std;
int d[20],f[20];
int main()
{
    d[1] = 1;
    for (int i = 2; i <= 12; i++)
        d[i] = 2 * d[i - 1] + 1;
    memset(f, 0x3f, sizeof(f));
    f[1] = 1;
    for (int i = 2; i <= 12; i ++)
        for(int j = 1; j < i; j ++)
            f[i] = min(f[i] , 2 * f[j] + d[i - j]);
    for (int i = 1; i <= 12; i++)
        cout << f[i] << endl;
    return 0;
}
posted @ 2020-12-18 17:59  hnkjdx_react  阅读(102)  评论(0编辑  收藏  举报