原题链接: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;
}