【递推】【DP】-HDU-1207-汉诺塔②

这篇博客探讨了如何使用动态规划(DP)解决汉诺塔问题,具体是四柱汉诺塔的变种。文章提供了题目的链接以及AC(Accepted)代码,帮助读者理解并实践递推方法在解决此类问题中的应用。
摘要由CSDN通过智能技术生成

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207

题目描述:四柱汉诺塔

解题思路:
开始想了方程 f [ n ] = 2 * f [n - 2] + 3和 f [ n ] = 2 * f [n - 3] + 7。结果都不对,很郁闷,纠结半天之后,上网查攻略去了,啊!我就差一点了,但也是差了最为关键的一步! 正确的方程应该是: f [ n ] = min ( 2 * f [n - x] + g ( x ) )。1 <= x < n, 不多解释了,就是这么回事,题目的数据给到 n 为64,long long 爆掉了,因为只比 long long 最大值大了一点肯定是负数,并且又不可能是答案,我按负数特殊处理了一下,AC。
这题的方程应该很有启发意义。。扩展了对DP的认识。

AC代码:

#include <iostream>
#include <algorithm>

using namespace std;

long long f[70];

long long g(int x)
{
    long long i,ans=1;
    for(i=1;i<=x;i++)
        ans*=2;
    return ans-1;
}

int main()
{
    int N,i,j;
    f[0]=0;
    f[1]=1;
    f[2]=3;
    f[3]=5;
    for(i=4;i<=64;i++)
    {
        long long ans;
        for(j=1;j<i;j++)
        {
            if(j==1)ans=2*f[i-j]+g(j);
            if(2*f[i-j]+g(j)<ans&&2*f[i-j]+g(j)>0)
                ans=2*f[i-j]+g(j);
        }
        f[i]=ans;
    }
    while(cin>>N)
    {
        cout<<f[N]<<endl;
    }
    return 0;
}
AC截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值