Strange Towers of Hanoi POJ - 1958(递推)

题意:就是让你求出4个塔的汉诺塔的最小移动步数,(1 <= n <= 12)

那么我们知道3个塔的汉诺塔问题的解为:d[n] = 2*d[n-1] + 1 ,可以解释为把n-1个圆盘移动到一个临时柱子上,然后将1个最大圆盘移动到目标的主子,最后再将n-1个圆盘移动到目标柱子。

为什么是n-1和1的组合呢,因为当你将n-i个圆盘移动到一个临时柱子上的时候,你会发现只靠两个柱子最多能移动1个圆盘。所以这个i=1

 

如果推到到4个柱子的汉诺塔,f[n] = min(f[n],2*f[n-i]+d[i]). (1 <= i < n),就是把n-i个圆盘移动到临时的一个柱子上,然后把剩下的 i 个圆盘在三个柱子中移动到目标柱子,最后把n-i移动会目标柱子

 1 #include<iostream>
 2 #include<string.h>
 3 #include<cstdio>
 4 using namespace std;
 5 
 6 int d[20];
 7 int f[20];
 8 int main()
 9 {
10     d[1] = 1;
11     for(int i=2;i<=12;i++)d[i] = (d[i-1]<<1)+1;
12     memset(f,0x3f,sizeof(f));
13     f[1] = 1;
14     for(int i=2;i<=12;i++)
15     {
16         for(int j=1;j<i;j++)
17         {
18             f[i] = min(f[i],(f[j]<<1)+d[i-j]);
19         }
20     }
21     for(int i=1;i<=12;i++)
22     {
23         printf("%d\n",f[i]);
24     }
25 }
View Code

 

posted @ 2018-12-10 21:24  进击的黑仔  阅读(137)  评论(0编辑  收藏  举报