今天才知道汉诺塔是DP。。。。我真是巨弱啊。。。
设DP[k][n]:表示含有k跟柱子,n个盘子时的最少移动次数 DP[K][N]=min(2*DP[K][S]+DP[K-1][P]);(S+P=N)
AC代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; #define MAX 0x3f3f3f3f double dp[5][70]; double DFS( int K, int N ){ if( K == 3 ){ double ans = 1; for( int i = 1; i <= N; i++ ){ ans *= 2; } return dp[K][N] = ans - 1; } if( dp[K][N] != -1 ){ return dp[K][N]; } double ans = MAX; for( int i = 1; i < N; i++ ){ ans = min( ans, 2 * DFS( K, i ) + DFS( K - 1, N - i ) ); } return dp[K][N] = ans; } int main(){ int N; for( int i = 3; i <= 4; i++ ){ for( int j = 0; j <= 64; j++ ){ dp[i][j] = -1; } } dp[4][1] = 1; dp[4][2] = 3; dp[4][3] = 5; while( scanf( "%d", &N ) != EOF ){ printf( "%.0lf\n", DFS( 4, N ) ); } return 0; }