POj-1958 Strange Towers of Hanoi-递推

版权声明:欢迎转载 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柱上
于是递推公式为:
h4[n]=min1i<n{2h4[i]+h3[ni]}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页