题意:就是让你求出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 ",f[i]); 24 } 25 }