#include<iostream>
#include<cstring>
using namespace std;
const int N = 15;
//首先用d[i]记录三个汉诺塔时所有的方案数,三个汉诺塔时将n个盘子A->C <==> n-1个盘子A->B(借助C)
//,将第n个盘子A->C,最后将n-1个盘子B->C,总共每个的方案为d[i] = 2 * d[i - 1] + 1,其中d[1] == 1
//表示一个盘子时为1步
//之后处理四个盘子的情况,A->D <==> 1.四个盘子下将i个盘子A->B 2.三个盘子下将n - i 个盘子A->D
//3. 四个盘子下将i个盘子B->D,故递推式为 f[n] = min(f[j] * 2 + d[n - j],f[n]) (j = 1->n - 1)
int main()
{
int f[N],d[N];
memset(f,0x3f,sizeof f);
d[1] = 1,f[1] = 1;
for(int i = 2;i <= 12;i++) d[i] = 2 * d[i - 1] + 1;
for(int i = 1;i <= 12;i++)
for(int j = 1;j < i;j++)
f[i] = min(f[i],2 * f[j] + d[i - j]);
for(int i = 1;i <= 12;i++) cout << f[i] << endl;
return 0;
}
96. 奇怪的汉诺塔
最新推荐文章于 2023-03-19 18:51:20 发布