Link

  https://jzoj.net/senior/#main/show/1229

Description

  Mpq 小时候只玩过俄罗斯方块这个经典的小游戏,当时他还不知道Hanoi 究竟是什么东西。话说当Mpq 第一次认识Hanoi 是在初三那年的联赛。由于Mpq 之前并不知道Hanoi 是什么东西,所以那一年他做完前三题之后很郁闷地坐了1 个半小时。。。好了,现在Mpq 成长了,他已经解决当年联赛那道Hanoi 了,在前几个月,他又发现一道关于Hanoi 的题目了,很幸运的是这个题目他知道怎么做了。。。然后为了让大家体验一下Mpq 初三联赛那种无奈的感觉,所以,这道题就神奇地出现在你们眼前。

  Task:赶快AC 这道题目,然后你就可以狂鄙视,甚至是无视Mpq 的存在了!!!   

  哎,吹着吹着发现我还没把题目写下来。。。。
  现在给你M 根柱子,初始的时候有N 个大小不一样的盘插在第一根柱子上面。同样地,规格大的盘子不能放在规格比它小的盘子上面。问最少需要多少次的移动才能将这N 个盘从第一根柱子移动到最后一根柱子上面?

Solution

30分

  因为m=3的情况的解是有规律可循的,所以输出2n-1即可

100分

  对于完整一次的汉诺塔操作,显然一定会在第2~n-1中某一根柱子上,堆砌起一堆按顺序的盘子,然后再将原本在第一根柱子的盘子均摊到其他没有盘子的柱子处(均摊指每个位置,除了最先堆砌起来那堆盘子所在的柱子外,其他柱子都只有1个盘子,且最大的盘子在第n根柱子处),然后依次将刚才均摊的盘子,放到最后一个柱子,再把最先堆砌起的盘子,均摊,依次摆放到最后一根柱子上。想不懂可以看下图

  ①显然一定会在第2~n-1中某一根柱子上,堆砌起一堆按顺序的盘子

  ②然后再将原本在第一根柱子的盘子均摊到其他没有盘子的柱子处(均摊指每个位置,除了最先堆砌起来那堆盘子所在的柱子外,其他柱子都只有1个盘子,且最大的盘子在第n根柱子处)

  ③然后依次将刚才均摊的盘子,放到最后一个柱子

  ④再把最先堆砌起的盘子,均摊,依次摆放到最后一根柱子上

  我们设f[i,j]表示你用i个盘子,j根柱子做汉诺塔的最优方案。

  设g[i,j]表示你用i个盘子,j根柱子做汉诺塔的最优方案,是在第2~n-1中某一根柱子上,堆砌起g[i,j]个按大小顺序叠起来的盘子。

  那么,假设柱子相同,盘子不定,考虑每次放一个盘子上去,这样就有两种情况

  第一种:就是这个盘子放在大盘子处,也就是说,他在上面的①流程中,是没有操作的,那么,这时第一次堆砌起来的盘子数量,就是少一个盆子时堆砌的数量,是g[i-1,j]

  第二种,就是把这个盘子放在较小盘子处,就是在①流程中执行操作的盘子,换句话说,就是第一次堆砌的盘子其中一个,那么这就比少一个盘子时第一次堆砌的盘子数量多了1,就是g[i-1,j]+1

  我们设当前第一次挪出去的盘子有k个,k=g[i-1,j]~g[i-1,j]+1(上面说过),那么显然

  f[i,j]=min(f[k,j]+f[i-k,j-1]+f[k,j])

  f[k,j]表示你先把k个挪出去摆成一堆的最优解

  f[i-k,j-1]表示你把剩下的i-k个盘子,均摊后,再挪到最后一根柱子,相当于直接整个柱子的盘子移到最后一个柱子。这时因为第一次挪的盘子占了1根柱子,所以只剩下j-1根柱子

  最后的f[k,j]表示你第一次挪出去摆成一堆的盘子

  每次的g[i,j]为较优的k

  很成功,我们解完这道题目了,网上有很多关于汉诺塔的探究,不过都不是这种算法的,都是只能求固定柱子的最优解。希望这篇博客可以帮到大家。

Code

  1. var
  2. n,m,i,j,k:longint;
  3. f,g:array[..,..] of qword;
  4. begin
  5. readln(n,m);
  6.  
  7. for i:= to do
  8. begin
  9. f[i,]:=f[i-,]*+;
  10. g[i,]:=i-;
  11. end;
  12.  
  13. for i:= to n do
  14. begin
  15. for j:= to m do
  16. begin
  17. f[i,j]:=maxlongint*maxlongint;
  18. k:=g[i-,j];
  19. if f[i,j]>f[k,j]*+f[i-k,j-] then
  20. begin
  21. f[i,j]:=f[k,j]*+f[i-k,j-];
  22. g[i,j]:=k;
  23. end;
  24.  
  25. k:=g[i-,j]+;
  26. if f[i,j]>f[k,j]*+f[i-k,j-] then
  27. begin
  28. f[i,j]:=f[k,j]*+f[i-k,j-];
  29. g[i,j]:=k;
  30. end;
  31. end;
  32. end;
  33.  
  34. writeln(f[n,m]);
  35. end.

[jzoj]1229.Hanoi的更多相关文章

  1. jzoj 6797. 【2014广州市选day2】hanoi

    Description 你对经典的hanoi塔问题一定已经很熟悉了.有三根柱子,n个大小不一的圆盘,要求大盘不能压在小盘上,初始时n个圆盘都在第一根柱子上,最少要多少步才能挪到最后一根柱子上? 现在我 ...

  2. Hanoi问题java解法

    用什么语言解法都差不多,思路都是一样,递归,这其中只要注重于开始和结果的状态就可以了,对于中间过程,并不需要深究.(我细细思考了一下,还是算了.=_=) 代码其实很简单注重的是思路. 问题描述:有一个 ...

  3. HDU1329 Hanoi Tower Troubles Again!——S.B.S.

    Hanoi Tower Troubles Again! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  4. ZOJ-1239 Hanoi Tower Troubles Again!

    链接:ZOJ1239 Hanoi Tower Troubles Again! Description People stopped moving discs from peg to peg after ...

  5. Codevs 1229 数字游戏

    1229 数字游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver     题目描述 Description Lele 最近上课的时候都很无聊,所以他发明了 ...

  6. Hanoi问题

    #include<stdio.h>int main(){ int m; void hanoi(int n,char x,char y,char z); printf("input ...

  7. The Towers of Hanoi Revisited---(多柱汉诺塔)

    Description You all must know the puzzle named "The Towers of Hanoi". The puzzle has three ...

  8. Hanoi塔

    2016-03-19 17:01:35 问题描述: 假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至 ...

  9. [CareerCup] 3.4 Towers of Hanoi 汉诺塔

    3.4 In the classic problem of the Towers of Hanoi, you have 3 towers and N disks of different sizes ...

随机推荐

  1. tomcat安装出现的闪退问题

    如果闪退 在该文件中结尾添加pause  可以检测到路径问题是不是有问题

  2. 通过awk 和 sed 将多余的列剔除

    通过awk 和 sed 将多余的列剔除 名词注释: awk -F 指定分隔符 OFS 指定输出分隔符 sed sed "s/|/test/2" a.log 将第二个 | 线替换为 ...

  3. C# 操作windows服务[启动、停止、卸载、安装]

    主要宗旨:不已命令形式操作windows服务 static void Main(string[] args) { var path = @"E:\开发辅助项目\WCF\WCF.Test\WC ...

  4. fcagte.exe应用程序错误

    原文:What is Fcagte.exe and How To Fix It? Overview of Fcagte.exe What Is Fcagte.exe? Fcagte.exe is a ...

  5. alpha冲刺2/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:拿快递也不能耽搁了软工 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 github代码管理规范 商家端订单 ...

  6. 【AtCoder】AGC013

    AGC013 A - Sorted Arrays 直接分就行 #include <bits/stdc++.h> #define fi first #define se second #de ...

  7. zabbix_agent YUM源配置

    wget http://repo.zabbix.com/zabbix/3.0/rhel/5/x86_64/zabbix-release-3.0-1.el5.noarch.rpm rpm -ivh za ...

  8. python 链接数据库错误

    用python3链接oracle产生错误: DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified mo ...

  9. 将input或textarea设置为disabled的样式问题

    input:disabled{ -webkit-text-fill-color: #333;//是用来做填充色使用的 -webkit-opacity: 1; color: #333; } textar ...

  10. 牛客挑战赛30 小G砍树 树形dp

    小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...