汉诺塔问题(含四柱加强版)

参考:四柱加强版汉诺塔HanoiTower

1. 经典汉诺塔

思路分析:首先分析三根柱子的汉诺塔:将第i-1个盘子从a柱通过三根柱子移动到b柱,然后将最大的移动到c柱,最后又将i−1个盘子通过三根柱子移动到c柱。在这个过程中的操作次数为dp[i]=2×dp[i−1]+1。即,2^n-1。

2. 四柱加强版

题目传送门:2021 ICPC 江西省大学生程序设计竞赛 F题

1、用4柱汉诺塔算法把A柱上部分的n−r个碟子通过C柱和D柱移到B柱上【F(n−r)步】;
2、用3柱汉诺塔经典算法把A柱上剩余的r个碟子通过C柱移到D柱上【2^r −1步】(参照三柱时的情况);
3、用4柱汉诺塔算法把B柱上的n−r个碟子通过A柱和C柱移到D柱上【F(n−r)步】;
4、依据上边规则求出所有r (1≤r≤n)情况下步数f(n),取最小值得最终解。
因此可得状态转移方程:F(n)=min(2×F(n−r)+2^r −1), (1≤r≤n)

样例输入:
5
1
2
3
4
5
样例输出:
1
3
5
9
13
//因数据范围过大,用python比较方便,   10000 --> 374931278650296101567069263458900577819295745
ans = [0 for i in range(10010)]
a = [0 for i in range(10010)]

def solve():
    n = int(input())
    print(ans[n])
    
def init():
    ans[1],ans[2],ans[3] = 1,3,5
    a[1],a[2],a[3] = 2,4,8
    cnt = 1
    for i in range(4,10001):
        ans[i] = ans[i - cnt] * 2 + a[cnt] - 1
        a[i] = 2 * a[i - 1]
        if(ans[i] > ans[i - cnt - 1] * 2 + a[cnt + 1] - 1):
            cnt += 1
            ans[i] = ans[i - cnt] * 2 + a[cnt] - 1

if __name__ == "__main__":
    init()
    t = int(input())
    while t:
        solve()
        t -= 1
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢nn

心动不如行动,感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值