码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1995 汉诺塔V

时间:2018-04-20 00:12:20      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:nbsp   const   问题   递推公式   ++   移动   set   经典   mem   

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1995

题意:经典汉诺塔题型,输出第k个盘子移动的次数。

解法:

首先:由于比k小的盘子移动不会牵扯k移动,所以问题被简化成n-k+1阶汉诺塔中第一个盘子的移动次数。

再观察汉诺塔的移动策略:

1)将A上n-1个盘子借助C座先移到B座上;

2)把A座上剩下的一个盘移到C座上;

3)将n-1个盘从B座借助于A座移到C座上。

 

步骤2)中该盘子未移动,所以递推公式f[n]=2*f[n-1],

由于问题已经转化成n-k+1阶汉诺塔,故所求通项f[n]=2^(n-k).

 

dp[i][j] :记录挪i个盘子第j个盘子需要挪的次数;

dp[i][j] = d[i-1][j]*2 ; if i==j , dp[i][j] =1;

 

AC:

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int imax = 62;
LL dp[imax][imax];
int t,n,k;
int main()
{
    memset(dp,0,sizeof(dp));
    dp[1][1] = 1;
    for(int i = 2 ; i < imax ; i++)
    {
        for(int j = 1 ; j < i ; j++)
            dp[i][j] = dp[i-1][j]<<1;//递推公式f(n) = 2*f(n-1);
        dp[i][i] = 1;
    }
    cin >>t;
    while(t--)
    {
        cin >> n >> k;
        cout << dp[n][k] <<endl;
    }
    return 0;
}

 

HDU 1995 汉诺塔V

标签:nbsp   const   问题   递推公式   ++   移动   set   经典   mem   

原文地址:https://www.cnblogs.com/zz990728/p/8886332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!