题目大意
解除n个盘子4座塔的Hanoi问题,最少需要多少步?
解法
设f[n]表示n个盘子4座塔需要的最少步数,d[n]表示n个盘子3座塔需要的最少步数
易知d[n] = 2 * d[n - 1] + 1
- 当n = 1时,显然f[1] = 1;
- 当n > 1时,可以先将i个盘子(1 <= i < n)用4座塔移开,再将n - i个盘子用3座塔移开,最后将开始移开的i个盘子用4座塔移至n - i个塔上
即:f[n] = min{2*f[i] + d[n-i]}(1 <= i <= n)
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int f[20], g[20];
int main(){
memset(f, 0x3f, sizeof(f));
g[1] = f[1] = 1;
printf("1\n");
for(int i = 2; i <= 12; ++i)
{
g[i] = g[i-1] * 2 + 1;
for(int k = 1; k < i; ++k)
{
f[i] = min(f[i], 2*f[k] + g[i-k]);
}
printf("%d\n", f[i]);
}
return 0;
}