首先回忆经典的汉诺塔问题: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;
}
}