算法训练营Day38(动态规划)

理论基础

动态规划的常见内容:

1动归基础: 例如,斐波那契、爬楼梯

2背包问题:  

3打家劫舍
4股票问题
5子序列问题

常见误区:

递归公式只是一部分,不要把注意力都集中在这里

需要考虑的步骤

1dp数组的以及下标的含义

2递推公式
3、dp数组如何初始化-----很有考究‘
4、遍历顺序
        遍历顺序也要考究,比如背包问题,先遍历背包还是先遍历物品
5 打印dp数组

 509. 斐波那契数 

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

class Solution {
    public int fib(int n) {
        if (n <= 1) return n; 
        //1dp数组的含义
        //i代表第i个斐波那契数  dp[i] 第i个斐波那契数的数值
        //3初始化
        int [] dp = new int[n+1];//f(0)=0 f(1)=1,此时大小为2
        dp[0]=0;
        dp[1]=1;
    

        //   4遍历顺序  

        for(int i = 2;i<=n;i++){
            //2递归公式
            dp[i] = dp[i-1]+dp[i-2];
            int sum = dp[0]+dp[1];
        }

        
        return dp[n];
    }
}

 70. 爬楼梯 

70. 爬楼梯 - 力扣(LeetCode)

class Solution {
    public int climbStairs(int n) {
        if(n==1) return 1;
        if(n==2) return 2;
        int [] dp = new int[n+1];//3 0 1 2 要下标有3,要+1
        
        dp[1] =  1;
        dp[2] = 2;
        for(int i = 3;i<=n;i++){
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
}

 746. 使用最小花费爬楼梯 

746. 使用最小花费爬楼梯 - 力扣(LeetCode)

很简单

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        //1、dp数组:i是哪个台阶 dp[i] 是到这里的最小消耗
        int [] dp = new int[cost.length+1];
        //3、初始化
        dp[0] = 0;
        dp[1] = 0;
        //4、遍历顺序
        for(int i = 2;i<=cost.length;i++){
            //2、递推公式
            dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[cost.length];
    }
}

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