POJ - 1958 Strange Towers of Hanoi(线性dp)
题目链接:点击查看
题目大意:继承经典的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)相关推荐
- poj 1958 Strange Towers of Hanoi
2019独角兽企业重金招聘Python工程师标准>>> Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K ...
- Strange Towers of Hanoi 汉诺塔问题及其升级(递推)四个汉诺塔问题
今天学习递推的汉诺塔问题,非常的有趣 文章目录 1.汉诺塔问题来源 分析 2.Strange Towers of Hanoi[DP][递推] 题目大意: 思考 解题步骤: 1.汉诺塔问题来源 汉诺塔( ...
- Strange Towers of Hanoi (POJ1958)
Strange Towers of Hanoi (POJ1958) n个盘子4座塔的Hanoi问题至少需要多少步?(1<=n<=12) 分析: n盘3塔: \(d[n] = 2*d[n-1 ...
- POJ1958 Strange Towers of Hanoi [递推]
题目传送门 Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3117 Ac ...
- POJ 1187 陨石的秘密 (线性DP)
题意: 公元11380年,一颗巨大的陨石坠落在南极.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点.经过一番侦察,科学家们发现陨石上 ...
- POJ - 3046 多重集组合数问题的线性DP(四种方法)
t 种蚂蚁,共a只,同种蚂蚁不区分,构成各种大小的不同多重集,问大小在闭区间[s,b]的多重集共有多少个 多重集的意思是元素可重复,构成元素或重数不同就是不同的多重集,比如{1,1,2,3}是一个多重 ...
- poj1958 Strange Towers of Hanoi 题解报告
题目传送门 [题目大意] 有四个汗诺塔,$n$个盘子,求最小移动步数. [思路分析] 对于三个汗诺塔的情况,设$f[i]$表示移动$i$个盘子所需的最小步数,当已经有$i-1$个盘子移动到位时,需要把 ...
- poj 1088 滑雪(线性DP)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 81553 Accepted: 30437 Description ...
- POJ - 1050 To the Max(最大连续子段和,线性dp)
题目链接:点击查看 题目大意:给出一个n*n的矩阵,每个点都有一个权值,现在要从中选取一个子矩阵要求权值和最大,问这个最大权值和是多少 题目分析:因为是要求子矩阵的权值和最大的问题,我们可以直接维护一 ...
最新文章
- 转:不是技术牛人,如何拿到国内IT巨头的Offer
- idea修改java和jsp不起作用_使用IDEA编写jsp时EL表达式不起作用的问题及解决方法...
- 009_JavaScript语句、表达式和代码块
- Building System之 get_abs_build_var() get_build_var()
- 160个Crackme047
- sql 12天内的数据_想要在12周内成为数据科学家吗?
- <load-on-startup>1</load-on-startup>的作用
- 分治法在求解“最近对”问题中的应用(JAVA)
- 安装composer 提示需要反复重启解决办法
- 基于函数的二叉树的描述
- hdu 3105 Fred's Lotto Tickets (水)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
- lvs+keeplive
- Docker本地镜像
- 下列选项中不是具体的python序列类型的是_以下选项中,不是具体的Python序列类型的是...
- pytorch以图搜图作业
- 癫痫的神经行为和临床共病:白质网络中断/损伤的作用
- 超神,chatexcel快速制作任意excel表格,给出指令即可
- 【电脑问题解决】回收站右键,多出来个“找回清空的文件”选项,怎么删除这个选项?
- js递归生成树结构数据