AcWing 96. 奇怪的汉诺塔
原题链接
简单
作者:
柯西喔
,
2024-11-17 20:43:37
,
所有人可见
,
阅读 1
#include<iostream>
#include<cstring>
using namespace std;
const int N = 15;
int n = 12;
int d[N],f[N];
int main()
{
memset(f, 0x3f, sizeof f);
f[0] = 0;
/*
三塔问题
【n-1个盘子:从A-->借助C-->放到B】+【1个盘子:从A-->放到C】+【n-1个盘子:从B-->借助A-->放到C】
即:d[i] = d[i-1] + 1 + d[i-1]
*/
for(int i=1;i<=n;i++) d[i] = d[i-1] + 1 + d[i-1];
/*
四塔问题 共i盘子
【j个盘子:从A-->借助C、D-->放到B】 f[i]
【剩下的i-j个盘子:从A-->借助C-->放到D 三塔问题】 d[n-i]
【j个盘子:从B-->借助A、C-->放到D】 f[i]
j从1~12遍历,分别给出1~12个盘子的最佳情况:
在盘子总数为i的前提下,由于不知道究竟到底j取多少才是最优解
也就是说不知道该取多少个盘子先放在B,因此需要遍历,取min
f[i] = min(f[i], f[j]*2 + d[n-i]);
*/
for(int i=1;i<=n;i++) // 共n盘子
for(int j=0;j<=i;j++) // 取前j个盘子放到B上
f[i] = min(f[i], 2*f[j] + d[i-j]);
for(int i=1;i<=n;i++) cout<<f[i]<<endl;
}