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

参考:四柱加强版汉诺塔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

版权声明:本文为m0_53726614原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。