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

var
n,m,i,j,k:longint;
f,g:array[..,..] of qword;
begin
readln(n,m); for i:= to do
begin
f[i,]:=f[i-,]*+;
g[i,]:=i-;
end; for i:= to n do
begin
for j:= to m do
begin
f[i,j]:=maxlongint*maxlongint;
k:=g[i-,j];
if f[i,j]>f[k,j]*+f[i-k,j-] then
begin
f[i,j]:=f[k,j]*+f[i-k,j-];
g[i,j]:=k;
end; k:=g[i-,j]+;
if f[i,j]>f[k,j]*+f[i-k,j-] then
begin
f[i,j]:=f[k,j]*+f[i-k,j-];
g[i,j]:=k;
end;
end;
end; writeln(f[n,m]);
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. ZOJ 3785 What day is that day?(数论:费马小定理)

    What day is that day? Time Limit: 2 Seconds      Memory Limit: 65536 KB It's Saturday today, what da ...

  2. SpringMVC之使用ResponseEntity,java接口返回HttpStatus

    Post请求 一般情况下,在非必须的情况下,使用Jquery实现post请求,而后台返回一般都需要手动封装ResponseUtil,和使用@ResponseBody注解来实现返回.然而我们书上学到的关 ...

  3. 五.hadoop 从mysql中读取数据写到hdfs

    目录: 目录见文章1 本文是基于windows下来操作,linux下,mysql-connector-java-5.1.46.jar包的放置有讲究. mr程序 import java.io.DataI ...

  4. MyBatis - 7.MyBatis逆向 Generator

    MyBatis Generator: 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类.支持基本的增删改查,以及QBC风格的条 ...

  5. 原生开发小程序 和 wepy 、 mpvue, Taro 对比

    https://blog.csdn.net/yang450712123/article/details/79623518 mpvue https://www.cnblogs.com/bgwhite/p ...

  6. 记JS一个错误,

    在定义变量时候,如果直接定义 var obj=null;那么,在转码时候,比如转为base64,此时或出现特殊的文字(也是汉字,只是很少见少用的文字,而且,出现的文字是根据你给obj赋值决定的,) 由 ...

  7. rimraf node_modules 快速删除

     npm install -g rimraf   // 先进行全局安装 rimraf node_modules   // 进行删除   -------------------------------- ...

  8. 去掉select的原有样式

    1:设置select的边框为0px,背景设成透明(background: transparent;),这时候你会看到边框没有了,但是小三角还是在的.再在select外面加个div,固定死div的宽度, ...

  9. js拷贝

    现在有一个对象 var obj = { name: '隔壁老王', age: 60, sex: 'male' } 我们现在想把obj里的每一个属性拷贝到一个空对象var obj1 = {}中,那么需要 ...

  10. 咸鱼入门到放弃1--JDBC

    JDBC参考微博https://www.cnblogs.com/surfcater/p/10224502.html 主要内容 1.JDBC相关概念 2.JDBC常用接口 driver connecti ...