代码随想录 DP开始

前言:磨磨蹭蹭的终于来到了DP,科大的校线还没出,一想到很可能出线的那天就是我复试生活结束的那天,还是有些伤感的,但慢慢的就体会到,生活中没有那么多付出——回报的过程,更多的是付出——失败,再起身,等待下次命运的审判^-^,看到身边的人付出有了回报,我真心祝愿他们一直这样意气风发,而那些失意的人,希望幸运就在转角处,多坚持一下下把!好了废话不多说,DP要下大功夫。

509. 斐波那契数 - 力扣(LeetCode)

思路:按照dp五部曲,

下标含义:就是i的斐波那契数是多少

先确定遍历顺序:从前到后

递归公式:题中已给

初始化:题中已给

class Solution {
public:
    int fib(int n) {
        vector result(n+1);//分清楚括号和中括号的区别,中括号的话就是定义二维数组了
        if(n<=1) return n;//不注意边界条件,就很容易引发边界问题
        result[0]=0;
        result[1]=1;
        for(int i=2;i<=n;i++){
            result[i]=result[i-1]+result[i-2];
        }
        return result[n];
    }
};

总结:对于出现下标中有计算的,要多关注一下边界条件(见注释),还有一点是创建数组的时候中括号和括号的使用

70. 爬楼梯 - 力扣(LeetCode)

思路:首先思考五大步骤,我认为难点还是在于递推公式。首先题目规定了只能走一步或者两步,那么我们思考若计算dp[n],再往前推一次是什么呢,那就是dp[n-1]走一步到n,dp[n-2]走两步到n,这样我们的递推公式就出来了

class Solution {
public:
    int climbStairs(int n) {
        vector dp(n+1);
        if(n<=2) return n;
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++){
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
};

你可能感兴趣的:(算法,动态规划)