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