[POJ1958]Strange Towers of Hanoi

分析

汉诺四塔

设 \(f[i]\) 表示求解 \(i\) 盘四塔的最少步数,设 \(d[i]\) 表示求解 \(i\) 盘三塔的最少步数:
\[
d[i]=2\cdot d[i-1]+1\f[i]=\min_{j=1}^{i-1}\left\{2\cdot f[j]+d[i-j]\right\}
\]
第二个递推式的含义是,将 \(j\) 盘在四塔模式下移动到一个中转柱,将剩余的 \(n-j\) 盘在三盘模式下移动到目标柱,再将那 \(j\) 个盘在四盘模式下移动到目标柱。

代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,f[20],d[20];
int D(int x){
    if(x==1)return 1;
    if(d[x])return d[x];
    return d[x]=D(x-1)*2+1;
}
int F(int x){
    if(x==1)return 1;
    if(f[x])return f[x];
    int res=0x3f3f3f3f;
    for(int i=1;i<x;i++)res=min(res,F(i)*2+D(x-i));
    return f[x]=res;
}
int main(){
    for(int i=1;i<=12;i++)printf("%d\n",F(i));
    return 0;
}

原文地址:https://www.cnblogs.com/sshwy/p/11026366.html

时间: 2024-11-13 01:28:50

[POJ1958]Strange Towers of Hanoi的相关文章

POJ1958 Strange Towers of Hanoi --- 递推【n盘m塔Hanoi塔问题】

POJ1958 Strange Towers of Hanoi Sol: n盘4塔问题可以分为3步: 1.以4塔模式移走i个盘. 2.以3塔模式将剩余n-i个盘移至第4塔. 3.以4塔模式将第一步中的i个盘移至第4塔. 我们用\(d[i]\)表示在3塔模式下移i个盘的最小步数,\(f[i]\)表示在4塔模式下移i个盘的最小步数. 递推式:\(f[i]=\min_{1\leq j < i}(2*f[j]+d[i-j])\) EX 本题可以拓展至n盘m塔问题. \(f[i][j]\)表示在i塔模式下

poj1958——Strange Towers of Hanoi

The teacher points to the blackboard (Fig. 4) and says: "So here is the problem: There are three towers: A, B and C. There are n disks. The number n is constant while working the puzzle. All disks are different in size. The disks are initially stacke

[POJ1958]Strange Towers of Hanoi (递推)

POJ炸了 所以放这里来 #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<map> #include<queue> #include<vector> #include<stack> #include<algorithm> #include<iostream> #define max(

Strange Towers of Hanoi (POJ1958)

Strange Towers of Hanoi (POJ1958) n个盘子4座塔的Hanoi问题至少需要多少步?(1<=n<=12) 分析: n盘3塔: \(d[n] = 2*d[n-1]+1\) => \(d[n] = 2^n - 1\) 前n-1盘子 A -> B 第n盘子 A -> C 前n-1盘子 B -> C n盘4塔:\(f[n] = min_{1\leq i<n}\{2*f[i] + d[n-i]\}\) 把i个盘子 A->B (四塔模式)

POJ 1958 Strange Towers of Hanoi (线性dp,记忆化搜索)

JQuery工具方法. (1)$.isNumeric(obj) 此方法判断传入的对象是否是一个数字或者可以转换为数字. isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...&

poj 1958 Strange Towers of Hanoi

Strange Towers of Hanoi Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2678   Accepted: 1742 Description Background Charlie Darkbrown sits in another one of those boring Computer Science lessons: At the moment the teacher just explains

POJ 1958 Strange Towers of Hanoi (四塔问题,线性dp,记忆化搜索)

题目分析:四柱汉诺塔.由于题目已经给出了求解方法,直接写代码即可.下面总结一下,四塔问题. 感谢这篇文章的作者,点这里就到,总结的很好.直接贴过来~ 四塔问题:设有A,B,C,D四个柱子(有时称塔),在A柱上有由小到大堆放的n个盘子. 今将A柱上的盘子移动到D柱上去.可以利用B,C柱作为工作栈用,移动的规则如下: ①每次只能移动一个盘子. ②在移动的过程中,小盘子只能放到大盘子的上面. 设计并实现一个求解四塔问题的动态规划算法,并分析时间和空间复杂性. 算法思想: 用如下算法移动盘子(记为Fou

POJ 1958 Strange Towers of Hanoi 解题报告

Strange Towers of Hanoi 大体意思是要求\(n\)盘4的的hanoi tower问题. 总所周知,\(n\)盘3塔有递推公式\(d[i]=dp[i-1]*2+1\) 令\(f[i]\)为4塔转移步骤. \(f[i]=min(f[i],f[k]*2+d[i-k])\) 即先以4塔以上面的\(k\),再以3塔移\(i-k\),最后以4塔移动回去. 可以推广到\(n\)盘\(m\)塔 2018.5.26 原文地址:https://www.cnblogs.com/ppprseter

Strange Towers of Hanoi

题目链接:http://sfxb.openjudge.cn/dongtaiguihua/E/ 题目描述:4个柱子的汉诺塔,求盘子个数n从1到12时,从A移到D所需的最大次数.限制条件和三个柱子的汉诺塔问题相同. 解题思路:采用动态规划算法的思路为先从将k个盘子使用4个柱子的方法从A移到B,然后将A上剩下的n-k个盘子使用3个柱子的方法移到D上,然后再使用4个柱子的方法将B上的k个盘子移到D上.可以明白这道题会产生很多重复子问题.所以先计算出使用3个柱子的方法从A移到B的次数用数组f3保存.然后计