http://acm.hdu.edu.cn/showproblem.php?pid=1207
汉诺塔2:
对于四柱汉诺塔问题,可以分为如下几步,和经典汉诺塔问题极为相似:
1. 先把x个盘子从a借助b,c移到d柱上,需要步骤为f(x).
2.把剩余的n-x个盘子借助b柱从a移到c柱上(不能依靠d柱是因为d住上盘子编号比剩余的n-x个小),这又变为经典汉诺塔问题,即需要步数为2^(n-x)-1;
3.把d柱上的x个盘子借助a,b柱移到c柱上,需要步数也为f(x);
综上所述,总步数为f(n) = 2*f(x)+2^(n-x)-1.可以发现f(n)的取值随着x变化而变化,因为要求最小值,所以可以遍历x,然后取最小的一个f(n)就好了。
注意初始化 f(1) = 1 ,f(2) = 3;
/* */ # include <bits/stdc++.h> # include <cmath> # include <cstdio> using namespace std; int dp[65]; int main() { int n; dp[1] = 1; dp[2] = 3; int min = 99999999; double t; for( int i=3; i<=64; i++ ) { for( int j=1; j<i; j++ ) { t = 2 * dp[j] + pow(2, (i-j))-1; if( t<min ) { min = t; } } dp[i] = min; min = 99999999; } while( ~ scanf("%d", &n) ) { printf("%d ", dp[n]); } }