汉诺塔问题合集之汉诺塔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\n", dp[n]);
    }
}

 

posted @ 2019-04-10 20:56  swsyya  阅读(276)  评论(0编辑  收藏  举报

回到顶部