首先回忆经典的汉诺塔问题:n个盘子3个塔,最开始都叠在第一个塔上,要变换到第三个塔。

\(f_n = 2*f_{n - 1} + 1\)。

\(g_n = min \{2 * g_{k} + f_{n - k}\}\)。

#include <bits/stdc++.h>
using namespace std;

const int N = 15;

int f[N], g[N];

int main () {
    f[1] = 1;
    for (int i = 2; i <= 12; ++i) {
        f[i] = f[i - 1] * 2 + 1;
        g[i] = 0x3f3f3f3f;
    }
    g[1] = 1;
    for (int i = 2; i <= 12; ++i) {
        int min_ans = 0x3f3f3f3f;
        for (int k = 0; k <= i; ++k) {
            g[i] = min (g[i], 2 * g[i - k] + f[k]);
        }
    }
    for (int i = 1; i <= 12; ++i) {
        cout << g[i] << endl;
    }
}

相关文章: