题目链接:点击查看

题目大意:继承经典的n个盘子三座塔的汉诺塔问题,现在问对于n个盘子四座塔的升级版汉诺塔问题,对于n=1~12的答案分别是多少

题目分析:首先分析三座塔的情况,对于第n个盘子而言,我们需要先将上面n-1个盘子先从A柱子放到B柱子上去,再将第n个盘子放到C柱子上去,最后再将B柱子上的n-1个盘子转移到C柱子上就好了,状态转移方程也很好写,设dp1[i]为转移i个盘子所需要的步数,那么上述的过程可以描述为dp[i]=dp[i-1]+1+dp[i-1]=dp[i-1]*2+1

现在我们再来分析一下对于四座塔的情况,因为对于三座塔而言,我们只能将n拆成n-1和1,所以转移方程也就是一个简单的等式关系,而四座塔的情况,有两个塔可以辅助完成转移,也就是说一开始我们可以将j个盘子从A柱子放到B柱子上去(四塔移动),然后再将n-j个盘子从A柱子放到D柱子上去(三塔移动),最后将j个盘子从B柱子放到D柱子上去(四塔移动),因为我们保证了分成的两堆盘子j和n-j一定是连续的序号,所以不妨设dp2[i]代表在四座塔的情况下转移i个盘子所需要的最小步数,那么转移方程也就很好写了:dp2[i]=min(2*dp2[j]+dp1[i-j]),这样就能遍历所有可行情况从而找到最优答案了,因为我们在处理第1个盘子到第j个盘子的时候,是在处理四座塔的汉诺塔问题,所以需要的步数是dp2[i],然后再处理第j+1~n个盘子的时候,刚才放1~j的那个柱子已经不能用了,所以此时面对的是三座汉诺塔问题,这样一来dp2的更新就需要借助dp1和dp2的前置状态了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;LL dp1[20],dp2[20];int main()
{
//  freopen("input.txt","r",stdin);
//    ios::sync_with_stdio(false);memset(dp2,inf,sizeof(dp2));//因为要维护最小值,所以初始化dp2为无穷大dp1[1]=dp2[1]=1;//维护边界:转移1个盘子的最小步数都是1步for(int i=2;i<=12;i++)//转移dp1dp1[i]=2*dp1[i-1]+1;for(int i=2;i<=12;i++)//转移dp2for(int j=1;j<i;j++)dp2[i]=min(dp2[i],2*dp2[j]+dp1[i-j]);for(int i=1;i<=12;i++)printf("%lld\n",dp2[i]);return 0;
}

POJ - 1958 Strange Towers of Hanoi(线性dp)相关推荐

  1. poj 1958 Strange Towers of Hanoi

    2019独角兽企业重金招聘Python工程师标准>>> Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K ...

  2. Strange Towers of Hanoi 汉诺塔问题及其升级(递推)四个汉诺塔问题

    今天学习递推的汉诺塔问题,非常的有趣 文章目录 1.汉诺塔问题来源 分析 2.Strange Towers of Hanoi[DP][递推] 题目大意: 思考 解题步骤: 1.汉诺塔问题来源 汉诺塔( ...

  3. Strange Towers of Hanoi (POJ1958)

    Strange Towers of Hanoi (POJ1958) n个盘子4座塔的Hanoi问题至少需要多少步?(1<=n<=12) 分析: n盘3塔: \(d[n] = 2*d[n-1 ...

  4. POJ1958 Strange Towers of Hanoi [递推]

    题目传送门 Strange Towers of Hanoi Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3117   Ac ...

  5. POJ 1187 陨石的秘密 (线性DP)

    题意: 公元11380年,一颗巨大的陨石坠落在南极.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点.经过一番侦察,科学家们发现陨石上 ...

  6. POJ - 3046 多重集组合数问题的线性DP(四种方法)

    t 种蚂蚁,共a只,同种蚂蚁不区分,构成各种大小的不同多重集,问大小在闭区间[s,b]的多重集共有多少个 多重集的意思是元素可重复,构成元素或重数不同就是不同的多重集,比如{1,1,2,3}是一个多重 ...

  7. poj1958 Strange Towers of Hanoi 题解报告

    题目传送门 [题目大意] 有四个汗诺塔,$n$个盘子,求最小移动步数. [思路分析] 对于三个汗诺塔的情况,设$f[i]$表示移动$i$个盘子所需的最小步数,当已经有$i-1$个盘子移动到位时,需要把 ...

  8. poj 1088 滑雪(线性DP)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 81553   Accepted: 30437 Description ...

  9. POJ - 1050 To the Max(最大连续子段和,线性dp)

    题目链接:点击查看 题目大意:给出一个n*n的矩阵,每个点都有一个权值,现在要从中选取一个子矩阵要求权值和最大,问这个最大权值和是多少 题目分析:因为是要求子矩阵的权值和最大的问题,我们可以直接维护一 ...

最新文章

  1. 转:不是技术牛人,如何拿到国内IT巨头的Offer
  2. idea修改java和jsp不起作用_使用IDEA编写jsp时EL表达式不起作用的问题及解决方法...
  3. 009_JavaScript语句、表达式和代码块
  4. Building System之 get_abs_build_var() get_build_var()
  5. 160个Crackme047
  6. sql 12天内的数据_想要在12周内成为数据科学家吗?
  7. <load-on-startup>1</load-on-startup>的作用
  8. 分治法在求解“最近对”问题中的应用(JAVA)
  9. 安装composer 提示需要反复重启解决办法
  10. 基于函数的二叉树的描述
  11. hdu 3105 Fred's Lotto Tickets (水)
  12. hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
  13. lvs+keeplive
  14. Docker本地镜像
  15. 下列选项中不是具体的python序列类型的是_以下选项中,不是具体的Python序列类型的是...
  16. pytorch以图搜图作业
  17. 癫痫的神经行为和临床共病:白质网络中断/损伤的作用
  18. 超神,chatexcel快速制作任意excel表格,给出指令即可
  19. 【电脑问题解决】回收站右键,多出来个“找回清空的文件”选项,怎么删除这个选项?
  20. js递归生成树结构数据

热门文章

  1. 自定义图片验证码认证过滤器
  2. Ribbon-负载均衡原理
  3. Maven依赖项的适用范围scope
  4. SpringMVC拦截器-拦截器的作用
  5. ThreadLocal是救火队长
  6. 本地消息表实现机制讲解
  7. 用户操作-查询所有用户操作
  8. TCP通信的客户端代码实现
  9. 使用Actuator检查与监控
  10. 基本的SQL-SELECT语句练习