
版权声明:欢迎转载 https://blog.csdn.net/suntengnb/article/details/79961190
问题描述:
解出n个盘子4座塔的汉诺塔问题最少需要多少步?
AC代码:
int h3[20],h4[20];
int main()
{
int n;
while(cin >> n)
{
for(int i = 1; i <= n - 1; ++i)//预处理
h3[i] = 2 * h3[i - 1] + 1;
memset(h4,0x3F,sizeof(h4));//初始化为最大值
h4[1] = 1;//边界
for(int i = 1; i <= n; ++i)//对于h[i]
for(int j = 1; j <= i - 1; ++j)//枚举寄存的盘子数j
h4[i] = min(h4[i],2 * h4[j] + h3[i - j]);
cout << h4[n] << endl;
}
return 0;
}
解决方法:
这道题是经典汉诺塔问题的一个变形,由于4塔汉诺塔与3塔汉诺塔之间存在着关系,所以先来考虑3塔汉诺塔
有3根柱子分别为A、B、C,A柱上有n个盘子,要将这n个盘子从A柱移动到C柱,需要经过3个步骤:①将A柱上的n-1个盘子移动到B柱上②将第n个盘子从A柱移动到C柱③将B柱上的n-1个盘子移动到C柱
设h3[n]为从起始柱向目标柱移动n个盘子所花费的操作数,则d[n] = 2 * d[n - 1] + 1,d[1] = 1
而本题多了一个柱子,这个柱子可以寄存一些盘子。3塔模式下步数是确定的,为什么到了4塔模式就要求最小值了呢,这与在“多余”的那根柱子上寄存多少个盘子是有关系的,我们可以枚举这个值
为了分析方便,我们从初始局面开始考虑,假如我们寄存i个盘子到D柱上,A柱上剩下的n-i个盘子就只能在3塔模式下进行操作移动到C柱上,然后D柱上的i个盘子在4塔模式下移动到C柱上
于是递推公式为:
- 上一篇 POj-1845 Sumdiv-快速幂取模+质因数分解
- 下一篇 离散化