n盘m塔 汉诺塔

int dp[maxn][maxn];
signed main()
{
    /*n个盘 m座塔*/
    int n,m;
    n=31,m=31;

    /*初始化动规边界*/
    dp[2][1]=1;//初始化两座塔的情况
    for(int i=3; i<=m; ++i) dp[i][1]=1;//初始化只有一个盘的情况
    for(int i=2; i<=n; ++i) dp[3][i]=2*dp[3][i-1]+1;//初始化只有三座塔的情况

    /*计算m塔问题,m>3 */
    for(int i=4; i<=m; ++i){
        for(int j=2; j<=n; ++j){
            dp[i][j]=dp[i-1][j];
            for(int k=1; k<j; ++k)
                dp[i][j]=min(2*dp[i][k]+dp[i-1][j-k],dp[i][j]);
        }
    }

    /*输出结果*/
    for(int i=3;i<=m;++i){
        for(int j=1;j<=n;++j) pfk(dp[i][j]);
        pfhh;
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/LS-Joze/p/11566773.html