【4Hanoi】 奇怪的汉诺塔

传送门

题意

四塔汉诺塔,A,B,C,D四座塔,将所有盘子从A移动到D的最少步数

数据范围

\(1\leq n \leq 12\)

题解

  1. 三个塔的汉诺塔问题,最优方案:先挪走\(n-1\)个圆盘,然后再挪走圆盘\(n\),递推方程也就是 \(d_{i}=d_{i-1}\times 2+1\);

  2. 四塔情况,首先挪走 \(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]);
}
posted @ 2020-05-26 17:39  Hyx'  阅读(188)  评论(0编辑  收藏  举报