zoukankan      html  css  js  c++  java
  • 汉诺塔问题合集之汉诺塔2

    http://acm.hdu.edu.cn/showproblem.php?pid=1207

    汉诺塔2

    对于四柱汉诺塔问题,可以分为如下几步,和经典汉诺塔问题极为相似:

    1. 先把x个盘子从a借助b,c移到d柱上,需要步骤为f(x).

    2.把剩余的n-x个盘子借助b柱从a移到c柱上(不能依靠d柱是因为d住上盘子编号比剩余的n-x个小),这又变为经典汉诺塔问题,即需要步数为2^(n-x)-1;

    3.把d柱上的x个盘子借助a,b柱移到c柱上,需要步数也为f(x);

    综上所述,总步数为f(n) = 2*f(x)+2^(n-x)-1.可以发现f(n)的取值随着x变化而变化,因为要求最小值,所以可以遍历x,然后取最小的一个f(n)就好了。

    注意初始化    f(1) = 1 ,f(2) = 3;

    /* */
    # include <bits/stdc++.h>
    # include <cmath>
    # include <cstdio>
    using namespace std;
    
    int dp[65];
    int main()
    {
        int n;
        dp[1] = 1;
        dp[2] = 3;
        int min = 99999999;
        double t;
        for( int i=3; i<=64; i++ )
        {
            for( int j=1; j<i; j++ )
            {
                t = 2 * dp[j] + pow(2, (i-j))-1;
                if( t<min )
                {
                    min = t;
                }
            }
            dp[i] = min;
            min = 99999999;
        }
        while( ~ scanf("%d", &n) )
        {
            printf("%d
    ", dp[n]);
        }
    }
  • 相关阅读:
    在仅有的一次生命里活出自己最大的可能
    每个人都渴望赞美
    历练领导力的八字要诀
    爱情语录
    Ps
    别跟我要钱,我是教授
    改变人生的五个问题
    纪晓岚妙用口才
    智慧和智商
    经典
  • 原文地址:https://www.cnblogs.com/wsy107316/p/10686050.html
Copyright © 2011-2022 走看看