多柱汉诺塔问题Hanoi 动态规划求解方案数

大家都很强,可与之共勉。

问题描述:

n个盘子,m个柱子,从1号柱子移到m号柱子。满足汉诺塔的游戏规则,问最少的移动步数。

问题分析:

懒得分析了。
自己推一下,很简单的,我只想了一个小时23333

    for ( int i = 1 ; i <= 64 ; ++ i )
        for ( int j = 1 ; j <= 64 ; ++ j )  {
            dp [i] [j] = ~ ( 0ULL ) >> 1 ;
        }

    for ( int i = 1 ; i <= 64 ; ++ i )  dp [3] [i] = ( 1ULL << i ) - 1 ;

    for ( int k = 4 ; k <= 64 ; ++ k )  {  // column
        dp [k] [1] = 1, dp [k] [2] = 3 ;
        for ( int i = 3 ; i <= 64 ; ++ i )
            for ( int j = 1 ; j < i ; ++ j )  {
                smin ( dp [k] [i], ( dp [k] [j] << 1ULL ) + dp [k - 1] [i - j] ) ;
            }
    }

答案在dp[m][n]里面。

你可能感兴趣的:(多柱汉诺塔问题Hanoi 动态规划求解方案数)