【4Hanoi】 奇怪的汉诺塔
传送门
题意
四塔汉诺塔,A,B,C,D四座塔,将所有盘子从A移动到D的最少步数
数据范围
\(1\leq n \leq 12\)
题解
-
三个塔的汉诺塔问题,最优方案:先挪走\(n-1\)个圆盘,然后再挪走圆盘\(n\),递推方程也就是 \(d_{i}=d_{i-1}\times 2+1\);
-
四塔情况,首先挪走 \(j\) 个塔,也就是有四个塔可以选择,然后再挪走剩下的 \(n-j\)个塔,有三个塔可以选择,
状态转移方程:\(f_{i} = min( f_{i} , f_{j}\times 2 + d_{n-j} )\),\(i\) 表示当前一共有几个塔
Code
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i, a, n) for(int i = a; i < n; i ++)
const int N = 15;
ll d[N], f[N];
int main() {
int n = 12;
memset(f, 0x3f, sizeof f);
d[1] = f[1] = 1;
rep(i, 2, n + 1) d[i] = d[i-1]*2+1;
rep(i, 2, n + 1) rep(j,1,i) f[i]=min(f[i],f[j]*2 + d[i-j]);
rep(i, 1, n + 1) printf("%d\n",f[i]);
}