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

题目分析:四柱汉诺塔。由于题目已经给出了求解方法,直接写代码即可。下面总结一下,四塔问题。

感谢这篇文章的作者,点这里就到,总结的很好。直接贴过来~

四塔问题:设有A,B,C,D四个柱子(有时称塔),在A柱上有由小到大堆放的n个盘子。

今将A柱上的盘子移动到D柱上去。可以利用B,C柱作为工作栈用,移动的规则如下:

①每次只能移动一个盘子。

②在移动的过程中,小盘子只能放到大盘子的上面。

设计并实现一个求解四塔问题的动态规划算法,并分析时间和空间复杂性。

算法思想:

用如下算法移动盘子(记为FourPegsHanoi):

1)、将A柱上n个盘子划分为上下两部分,下方部分共有k(1≤k≤n)个盘子,上方部分共有n - k个盘子。

2)、将A柱上面部分n–k个盘子使用FourPegsHanoi算法经过C、D柱移至B柱。

3)、将A柱剩余的k个盘子使用ThreePegsHanoi算法经过C柱移至D柱。

4)、将B柱上的n–k个盘子使用FourPegsHanoi算法经过A、C柱移至D柱。

ThreePegsHanoi算法如下(设三个柱子分别为A、B、C,A柱上共有k个盘子):

1)、将A柱上方k-1个盘子使用ThreePegsHanoi算法经过B柱移至C柱。

2)、将C柱上最后一个盘子直接移至C盘。

3)、将B柱上k-1个盘子使用ThreePegsHanoi算法经过A柱移至C柱。

算法步骤:

根据动态规划的四个步骤,求解如下:

1)、最优子结构性质:

四柱汉诺塔问题的最优解是用最少的移动次数将A柱上的盘子全部移到D柱上。当盘子总数为i时,我们不妨设使用FourPegsHanoi的最少移动次数为f(i)。相应的ThreePegsHanoi 算法移动次数为g(k),由于g(k)=2g(k-1)+1=pow(2,k) -1,当k确定时,g(k)也是不变的。

f(i)为最优解时,其子问题f(i-k)也必为最优解。如果f(i-k)不是最优解,那么存在f’(i-k) < f(i-k)。用f’(i-k)替换f(i-k)将产生一个比f(i)更优的解。这与f(i)为最优解是矛盾的。所以本问题具有最优子结构性质。

2)、递归地定义问题的最优解:

根据上述FourPegsHanoi算法得到最少移动次数f(i):

通过这个表达式我们可以知道,k取那个值时f(i)的值,也就是说,不用具体操作,就可以知道移动的最少次数,并且知道k的值,所以在算法实现时,求出k的值是非常重要的。下面的代码就是用来求k的。

AC_CODE

//记忆化搜索
int dp[20];
int Move(int n){
    if(dp[n] != -1) return dp[n];
    int s = 1<<30;
    for(int i = 1;i <= n;i++){
        s =  min(s , 2 * Move(n - i) + (int)pow(2.0 , 1.0*i) - 1);
    }
    return dp[n] = s;
}

int main()
{   //freopen("in.txt","r",stdin);
    int i , j , k;
    for(i = 1;i <= 12;i++){
        memset(dp , -1 , sizeof(dp));
        dp[1] = 1;
        dp[0] = 0;
        cout << Move(i) << endl;
    }
    return 0;
}
//线性dp
int dp[20];
int main()
{   //freopen("in.txt","r",stdin);
    int i , j , k;
    for(i = 0;i <= 13;i++) dp[i] = inf;
    dp[1] = 1;
    dp[0] = 0;
    for(i = 1;i <= 12;i++){
        for(j = 1;j <= i;j++)
            dp[i] = min(dp[i] , 2*dp[i - j] + (int)pow(2.0 , 1.0*j) - 1);
    }
    for(i = 1;i <= 12;i++){

        cout << dp[i] << endl;
    }
    return 0;
}

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

时间: 2024-10-12 16:56:11

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

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 解题报告

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

Prob.2[动态规划+递推+划归思想的应用]POJ 1958 Strange Towers Of Hanoi Upd:2020.3.1

传送门:http://poj.org/problem?id=1958 汉诺塔:https://www.cnblogs.com/antineutrino/p/3334540.html 问题引入:这个在标准的三塔问题上又加了一维,我们先考虑三个塔是怎么计算的?可以具体地分成三个步骤: 1.假设A塔上有n个盘子,将A塔上n-1个盘子转移到B塔上. 2.将A塔上剩余的一个盘子转移到C塔上. 3.将B塔上剩余的n-1个盘子转移到C塔上 因为后转移的盘子小,上面n-1个盘子都能落在上面,2之后的C柱可以看成

POJ 4968 DP||记忆化搜索

给出N个人的平局分X 根据GPA规则计算可能的最高平均GPA和最低平均GPA 可以DP预处理出来所有结果  或者记忆化搜索 DP: #include "stdio.h" #include "string.h" int inf=100000000; double a[11][1100],b[11][1100]; double Max(double a,double b) { if (a<b) return b; else return a; } double M

poj 1088 滑雪(区间dp+记忆化搜索)

题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程:由于由位置[i, j]只能向四个方向移动,所以子问题最多有四个:所以dp[i][j]为其邻域可以滑雪的最大区域长度加上从该位置滑到邻域的长度,即1: 代码如下: #include <cstdio> #include <iostream> #include <algorithm&

POJ 1088: 滑雪(经典 DP+记忆化搜索)

滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 74996   Accepted: 27818 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17

POJ 3176-Cow Bowling(DP||记忆化搜索)

Cow Bowling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14210   Accepted: 9432 Description The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a standard

poj 1191 棋盘切割 (压缩dp+记忆化搜索)

一,题意: 中文题 二.分析: 主要利用压缩dp与记忆化搜索思想 三,代码: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> using namespace std; const int Big=20000000; int Mat[10][10]; int N; int sum[10][10]; int