题解 | 循环汉诺塔

循环汉诺塔

https://www.nowcoder.com/practice/cdf0808f841748faba058c8ef538c731

import sys

# 14:44

# 1. 分解子问题,还是分为挪底部(最后一块)和顶部(前n-1)块
# 2. A-->B的时候,先把前n-1块从A挪到B,再从B挪到C,再把底部挪到B,再把顶部从C挪到A再挪到B
# 注意,顶部A-->C, 和最后C-->A的步数一样,都是把n-1挪两个盘
# 因此 AB(N) = 2 AC(N-1) + 1
# 3. A-->C的时候,先把顶部挪到B在挪到C,即AC(N-1), 底部A挪到B,一步,再把顶部从C挪到A,即挪一个盘=AB(N-1),再把底部从B挪到C,一个步骤, 再把顶部从A挪到C,即AC(N-1)
# AC(N) = 2AC(N-1) + AB(N-1) + 2
# 尴尬,pythonO(N)最后一个也过不了, 估计只能用数学归纳做
# 动态规划

n = int(input())

last_ab = 1 # 也可以理解为挪一个盘的步骤
last_ac = 2 # 也可以理解为挪两个盘的步骤
p=1000000007

for i in range(2,n+1):
    now_ab = 2 * last_ac + 1
    now_ac = 2 * last_ac + last_ab + 2
    last_ab, last_ac = now_ab%p, now_ac%p # (a+b)%p = (a%p+b%p)%p


print(last_ab, last_ac)

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-12 18:53
第一次听说还有无水工作!!!又是被刷新三观的一天
Lynn012:666第一次听到,你给他说这里不方便我们加个微信
点赞 评论 收藏
分享
一tiao酸菜鱼:秋招还没正式开始呢,就准备有结果了。。。。?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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