96. 奇怪的汉诺塔递推

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了96. 奇怪的汉诺塔递推相关的知识,希望对你有一定的参考价值。

这是一道很经典的问题。


先看3个塔的情况
需要注意的是,这里的汉诺塔移动并无只可以移动到相邻塔的需求。即可以直接从A移到C。
设d[i]表示将i个盘子从这里移到其他除它之外塔的步数 ,总塔的数量为3
故d[i]=d[i-1]+d[i-1]+1 即将i-1个盘子移到B,将i号盘子移动C,再将i-1个盘子从B移到C

接下来分析4个塔的情况
设f[i]表示将i个盘子从这里移到其他除它之外塔的步数,总塔的数量为4
f[i]=min(f[i],f[j]+f[j]+d[i-j]) 将j个盘子移到一个柱子,此时的j个盘子已经占了一个柱子,故剩余的i-j个盘子按照三个盘子的套路移动到D,再将j个盘子弄到D
这里都是f[j]是因为,移开的时候好分析,有三个柱子可以用,回来的时候因为我们排好的盘子在D柱子已经是大的盘子,故不影响还是f[j]

#include<bits/stdc++.h>
using namespace std;
const int N=15;
int f[N],d[N];
int main(void)

    d[1]=1;
    for(int i=2;i<=12;i++) d[i]=d[i-1]*2+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],f[j]*2+d[i-j]);
    for(int i=1;i<=12;i++) cout<<f[i]<<endl;
    return 0;

以上是关于96. 奇怪的汉诺塔递推的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛进阶指南》-AcWing-96. 奇怪的汉诺塔-题解

HDU 2175 汉诺塔IX (递推)

BZOJ.1019.[SHOI2008]汉诺塔(递推)

96. 奇怪的汉诺塔

AcWing - 96 - 奇怪的汉诺塔 = dp

汉诺塔递推HDU2064