代码随想录算法训练营第38天 | 动态规划 part01 ●理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

理论基础

有很多重叠子问题

1.dp:一个状态由上一个状态推导出来

2.贪心:每次取局部最优(状态间没有关联)

贪心解决不了dp的问题(?但有的题目都可以用啊

动规五部曲

代码随想录算法训练营第38天 | 动态规划 part01 ●理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯_第1张图片 动规五部曲

代码随想录算法训练营第38天 | 动态规划 part01 ●理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯_第2张图片 代码随想录算法训练营第38天 | 动态规划 part01 ●理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯_第3张图片

代码随想录算法训练营第38天 | 动态规划 part01 ●理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯_第4张图片

leetcode上的题目都是01背包的应用,而没有纯01背包的问题 

 #509 fib

普通递归:

int fib(int n) {
        if(n<2) return n;
        return fib(n-1)+fib(n-2);
    }

dp:本题推导公式给出了所以容易就是 (n-1)+(n-2)

int fib(int n) {
        if(n<2) return n;
        vector dp(n+1);
        dp[0] = 0;
        dp[1] = 1;
         for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }

只存两个而不是vec来优化空间:

 int climbStairs(int n) {
        if (n <= 1) return n;
        int dp[3];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            int sum = dp[1] + dp[2];
            dp[1] = dp[2];
            dp[2] = sum;
        }
        return dp[2];
    }

#70 爬楼梯 easy

第一反应是用回溯法穷举,自我感觉应该写的没错,但是n=44就会TLE,结果确实也很大

    //TLE when n=44
    int res=0;
    void backtrack(int cnt, int n){
        cout<<"cnt: "<n) return;
        
        //1
        backtrack(cnt+1,n);

        //2
        backtrack(cnt+2,n);
    }
    int climbStairs(int n) {
        backtrack(0,n);
        return res;
        
    }

dp:可以先在函数里写return 0,然后run,就是先不写代码获得一些正确的case验证自己的想法 

代码随想录算法训练营第38天 | 动态规划 part01 ●理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯_第5张图片

int climbStairs(int n) {
        vector dp(n+1);
        dp[0]=1;
        dp[1]=1;
        for(int i=2;i<=n;i++){
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }

代码随想录算法训练营第38天 | 动态规划 part01 ●理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯_第6张图片

 这题的初始化有些特别,就是dp[0]没意义,(也可以在推导过程中发现他必须是1才能做),更合理的是,那就往后再初始化几个,初始化1,2,然后从3开始。学到的是:开头不好初始化那就把需要初始化的再延长,也延迟开始。

这题其实就是fib,然后fib也可以不存vec,只存0,1来优化空间

#746  使用最小花费爬楼梯 easy

题干稍微有点误导性,但是结合example1理解就会发现是爬到vec外面去

代码随想录算法训练营第38天 | 动态规划 part01 ●理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯_第7张图片

int minCostClimbingStairs(vector& cost) {
        vector dp(cost.size()+1);
        dp[0]=0;
        dp[1]=0;
        for(int i=2;i

 

 

你可能感兴趣的:(代码随想录一刷,算法,动态规划,leetcode,c++)