zoukankan      html  css  js  c++  java
  • 题解报告:hdu1995汉诺塔V(递推dp)

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

    Problem Description

    用1,2,...,n表示n个盘子,称为1号盘,2号盘,...。号数大盘子就大。经典的汉诺塔问
    题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于
    印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小
    顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱
    子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。我们
    知道最少需要移动2^64-1次.在移动过程中发现,有的圆盘移动次数多,有的少 。 告之盘
    子总数和盘号,计算该盘子的移动次数.

    Input

    包含多组数据,首先输入T,表示有T组数据.每个数据一行,是盘子的数目N(1<=N<=60)和盘
    号k(1<=k<=N)。

    Output

    对于每组数据,输出一个数,到达目标时k号盘需要的最少移动数。

    Sample Input

    2
    60 1
    3 1

    Sample Output

    576460752303423488
    4

    解题思路:找规律!

    当n=1时,1号盘子移动1次;

    当n=2时,1号盘子移动2次;

         2号盘子移动1次;

    当n=3时,1号盘子移动4次;--->2(3-1)

         2号盘子移动2次;--->2(3-2)

         3号盘子移动1次;--->2(3-3)

    猜想:移动i-1号盘子的次数是移动i号盘子次数的2倍。(实际上这个规律就是正确的)。

    因此,n个盘子第k号盘子需要的最少移动次数为2(n-k)次。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 int main()
     5 {
     6     int t,n,k;
     7     LL a[61]={1};
     8     for(int i=1;i<61;i++)
     9         a[i]=2*a[i-1];
    10     while(cin>>t){
    11         while(t--){
    12             cin>>n>>k;
    13             cout<<a[n-k]<<endl;
    14         }
    15     }
    16     return 0;
    17 }
  • 相关阅读:
    progresql
    postgresql
    postgresql
    postgresql 索引
    postgresql 视图
    postgresql 触发器
    postgresql异常快速定位
    postgresql数据库备份和恢复
    amgular $q用法
    安装fcitx
  • 原文地址:https://www.cnblogs.com/acgoto/p/8467772.html
Copyright © 2011-2022 走看看