zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    作业作业
    Alpha 冲刺 (4/10)
    Alpha 冲刺 (3/10)
    Alpha 冲刺 (2/10)
    Alpha 冲刺 (1/10)
    项目需求分析评审表
    项目需求分析答辩总结
    项目选题报告答辩总结
    UML
    各组项目答辩评分与存在问题
  • 原文地址:https://www.cnblogs.com/hnkjdx-ssf/p/14156231.html
Copyright © 2011-2022 走看看