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保存。然后计算n=1到12时,k从1到i-1变化时,f4[n]的大小。计算过程满足下边的方程f4[n]=min(1≤k<i)(f3[k]+2*f[i-k]);当n=1时,f4[1]=1;

代码如下:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int f3[13];
int f4[13];
int three_hoi(int x){
    if(x==1)return 1;
    return 2*three_hoi(x-1)+1;
}
int main(){
    for(int i=1;i<=12;i++){
        f3[i]=three_hoi(i);
    }
    f4[1]=1;
//    memset(f4,-1,sizeof(f4));
    for(int i=2;i<=12;i++){
        f4[i]=65536;
    }
    for(int i=2;i<=12;i++){
        for(int j=i-1;j>=1;j--){
            int t=f3[j]+2*f4[i-j];
            if(t<f4[i]){
//                cout<<f4[i]<<"f4";
                f4[i]=t;
//                cout<<i<<"i"<<j<<"j";
//                cout<<t<<"t"<<endl;
            }
        }
    }
//    for(int i=1;i<=12;i++){
//        printf("%d\n",f3[i]);
//    }
//    system("pause");
    for(int i=1;i<=12;i++){
        printf("%d\n",f4[i]);
    }
    return 0;
}

对于给定的n,算法时间复杂度为O(n).

时间: 2024-12-24 14:22:58

Strange Towers of Hanoi的相关文章

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

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塔模式下

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 (四塔模式)

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(

[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\) 个盘在四盘模式下移动到目标柱. 代码 #inclu