题目大意:
问在
问题中,
解决
盘
塔问题最少需要多少步。
从
到
,依次回答。
分析:
考虑经典
问题,即
盘
塔,
设
表示
盘
塔的最少步数,
显然有
,即将前
个盘从柱
移动到柱
,然后将第
个盘移动到塔
,最后将前
个盘移动到塔
。
那么求解
盘
塔问题,就是可以由
盘
塔得到,
设
表示
盘
塔的最少步数,
则有
,即将前
个盘子在
塔模式移动到
,然后在
塔模式下移动剩下的
个盘子到
,最后在前将
个盘子移动到
。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N 20
using namespace std;
int h3[N], h4[N];
int main()
{
h3[1] = 1;
for (int i = 2; i <= 12; i++) h3[i] = h3[i-1]*2 + 1;
memset(h4, 0x3f, sizeof(h4));
h4[1] = 1;
for (int i = 2; i <= 12; i++)
for (int j = 1; j < i; j++) h4[i] = min(h4[i], h4[j]*2 + h3[i-j]);
for (int i = 1; i <= 12; i++) printf("%d\n", h4[i]);
return 0;
}