动态规划的实践(1)

作者分享了解决LeetCode70爬楼梯问题的递归和动态规划方法,强调了动态规划在减少重复计算上的优势。同时讨论了动态规划的特点和优点,如最优子结构、状态转移方程和时间空间效率。
摘要由CSDN通过智能技术生成

最近在刷leetcode。现在涉及到的是70 climbing staircase。我第一步想到的解法是递归,按照这个思路,其实很快就有答案。 

int climbStairs(int n) {
    if(n > 0 && rec[n] != 0)
    {
        return rec[n];
    }
    if(n == 0)
    {
        return 1;
    }
    else if(n < 0)
    {
        return 0;
    }
    int count = 0;
    for(int i = 0; i < 2; i++)
    {
        count += climbStairs(n - steps[i]);
    }
    
    rec[n] = count;
    return count;
}

这里使用了int rec[46]来缓存结果加快速度。效果很好,速度也比较满意。

但是毕竟这个题是有关动态规划的,详细看了下动态规划的思路。大概就是拆解第十步。

F(10) = F(9) + F(8),想一想也很好理解。F(9)到F(10)只有1步的走法,没有其它的选择。F(8)到F(10)也只有2步的走法,没有其它的选择。所以步数和以前是相同的。

改了一下代码如下:

int climbStairs(int n) {
    if(n > 0 && rec[n] != 0)
    {
        return rec[n];
    }
    if (n < 1){
        return 0;
        }
        if (n == 1){
            return 1;
        }
        if (n == 2){
            return 2;
        }
        int count = climbStairs(n - 1) + climbStairs(n - 2);
    
    rec[n] = count;
    return count;
}

从代码来说,本质上和之前其实也差不多。一个是从头开始,一个是倒着开始。leetcode的耗时也差不多。

回顾一下前阵看的北京交大的算法课,动态规划的流程如下:

1 分析最优子结构。

2 设计状态转移方程。

3 找到计算最优值的算法。

我也是刚学动态规划,感觉动态规划能干的事情,其实很多其它算法也能写出来,那么DP的优点在哪呢?估计是一个套路吧,有这个套路解决问题就有固定流程了。但是时间空间复杂度未必能做到最优。

第二就是动态规划和树的感觉比较接近,我接触的几个都可以用递归来处理,都存在可以剪枝的优化。可能还是接触的少吧。

B站看了一个图,总结的比较容易懂:

动态规划-哔哩哔哩_Bilibili

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值