Strange Towers of Hanoi

题目链接

http://poj.org/problem?id=1958

解题思路

三个的汉诺塔就不细说了,太基础了(还是细说了……):
将n个盘子从A通过B移到C的方案数表示为tir[n],完成这件事就得先把n-1个盘子从A通过C移到B,方案数为tir[n-1];再把n个盘子从A直接移动到C,方案数为1;最后把B上的n-1个盘子通过A移到C,方案数为tir[n-1]。所以转移方程为tir[i]=tir[i-1]*2+1;
至于四塔,我们还是分析这个过程:
A,B,C,D四个塔,开始的i个盘子都在A塔上,我们先把前k个盘子在四塔模下移动到B,方案数为dp[k];然后把i-k个盘子在三塔模式下移动到D,方案数为tir[i-k];最后把k个盘子在四塔模式下移动到D,方案数为dp[k]。所以转移方程为dp[i]=min( 2 * dp[k]+tir[i-k] ) ,k从1到i。
说实话我有点疑惑,为什么三塔就可以n个盘子就能直接从n-1转移来,但是四塔就要从小于n的情况中和最小的转移来?百度不到,好像没人有和我一样的疑惑
我只能暂时理解到四塔问题中的第二步(将i-k个移动到D上)是与tir三塔问题有关的,而不同的k会产生不同的tir,四塔问题中的每种盘子数不同的情况都受tir的影响,所以要由最佳转移而来。

AC代码

#include<iostream>
#include<cstring>
#define ll long long

using namespace std;
const int N=20;

int dp[N],tir[N];

int main()
{
    memset(dp,0x3f,sizeof dp);cout<<(dp[1]=1)<<endl;//初始化并输出
    for(int i=1;i<=12;i++) tir[i]=2*tir[i-1]+1;//求三塔
    for(int i=2;i<=12;cout<<dp[i]<<endl,i++)//求完接着输出
    for(int k=1;k<=i;k++)
    dp[i]=min(dp[i],dp[k]+dp[k]+tir[i-k]);//转移方程
}
算法进阶指南 文章被收录于专栏

例题代码及讲解(难的会pass)

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务