正题
题目链接:http://poj.org/problem?id=1958
大意
有4根柱子的汉诺塔,有n个盘,求移动次数
解题思路
首先我们定义只有三根柱子时有n个盘的话移动次数是dndn,然后dn=dn−1∗2+1dn=dn−1∗2+1
定义有四根柱子时有n个盘移动次数为fnfn
之后我们看四根柱子
我们可以将这个塔任意分割成两部分,上面有k个,一个有n个
之后我们开始移动上面的
次数fkfk
然后我们移动下面的到第4个柱子
这时无论如何也不可以到达第3根柱子于是我们可以看作只有3个盘,于是次数dn−kdn−k
最后我们在将小盘移过去
这时消耗fkfk
于是总代价为fk∗2+dn−kfk∗2+dn−k
之后我们枚举kk<script type="math/tex" id="MathJax-Element-686">k</script>取最优的答案就好了。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n=12,d[13],f[13];
int main()
{for (int i=1;i<=n;i++) d[i]=d[i-1]*2+1;//初始化f[1]=1;printf("1\n");for (int i=2;i<=n;i++){f[i]=2147483647;for (int j=1;j<i;j++)f[i]=min(f[i],f[j]*2+d[i-j]);//递推求最优解printf("%d\n",f[i]);//输出}
}