做网站 的主要收获,wordpress 新闻资讯,固定ip做网站怎么备案,s001网站建设代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 文章目录 代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯理论基础一、常规题目二、解题步骤…代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 文章目录 代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯理论基础一、常规题目二、解题步骤 509. 斐波那契数一、动态规划v1二、动态规划v2三、动态规划v3 70. 爬楼梯一、动态规划v1二、动态规划v2 746. 使用最小花费爬楼梯一、dp v1二、dp v2 理论基础
一、常规题目 二、解题步骤 对于动态规划问题我将拆解为如下五步曲这五步都搞清楚了才能说把动态规划真的掌握了 确定dp数组dp table以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 509. 斐波那契数
题目链接 确定dp数组以及下标的含义 dp[i]的定义为第i个数的斐波那契数值是dp[i]确定递推公式 状态转移方程 dp[i] dp[i - 1] dp[i - 2];dp数组如何初始化 题目中把如何初始化也直接给我们了如下 dp[0] 0; dp[1] 1;确定遍历顺序 从递归公式dp[i] dp[i - 1] dp[i - 2];中可以看出dp[i]是依赖 dp[i - 1] 和 dp[i - 2]那么遍历的顺序一定是从前到后遍历的打印dp数组 一、动态规划v1
class Solution:def fib(self, n):# 排除 Corner Caseif n 0:return 0# 创建 dp table dp [0] * (n 1)# 初始化 dp 数组dp[0] 0dp[1] 1# 遍历顺序: 由前向后。因为后面要用到前面的状态for i in range(2, n 1):# 确定递归公式/状态转移公式dp[i] dp[i - 1] dp[i - 2]# 返回答案return dp[n二、动态规划v2
class Solution:def fib(self, n):if n1:return ndp[0,1]for i in range(2,n1):total dp[0]dp[1]dp[0]dp[1]dp[1]total return total三、动态规划v3
class Solution:def fib(self, n):if n1:return nprev0,prev1 0,1for _ in range(2,n1):cur prev0 prev1prev0,prev1 prev1,curreturn cur70. 爬楼梯
题目链接 确定dp数组以及下标的含义 dp[i]的定义为爬到第i层楼梯有dp[i]种方法确定递推公式 dp[i - 1]上i-1层楼梯有dp[i - 1]种方法那么再一步跳一个台阶不就是dp[i]了么。 dp[i - 2]上i-2层楼梯有dp[i - 2]种方法那么再一步跳两个台阶不就是dp[i]了么 状态转移方程 dp[i] dp[i - 1] dp[i - 2];dp数组如何初始化 dp[1] 1; dp[2] 2;确定遍历顺序 从递归公式dp[i] dp[i - 1] dp[i - 2];中可以看出dp[i]是依赖 dp[i - 1] 和 dp[i - 2]那么遍历的顺序一定是从前到后遍历的打印dp数组 一、动态规划v1
class Solution(object):def climbStairs(self, n)::type n: int:rtype: intdp [0]*(n1)if n 2:return ndp[1]1dp[2]2for i in range(3,n1):dp[i]dp[i-1]dp[i-2]return dp[n]二、动态规划v2
class Solution(object):def climbStairs(self, n)::type n: int:rtype: intdp[0,1,2]if n 2:return nfor i in range(3,n1):total dp[1]dp[2]dp[1]dp[2]dp[2]totalreturn total746. 使用最小花费爬楼梯
题目链接 确定dp数组以及下标的含义 dp[i]的定义为到达第i台阶所花费的最少体力为dp[i]确定递推公式 dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] cost[i - 1] dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] cost[i - 2] 状态转移方程 : dp[i] min(dp[i - 1] cost[i - 1], dp[i - 2] cost[i - 2]);dp数组如何初始化 dp[0] 0; dp[1] 0;确定遍历顺序 因为是模拟台阶而且dp[i]由dp[i-1]dp[i-2]推出所以是从前到后遍历cost数组就可以了打印dp数组 一、dp v1
class Solution(object):def minCostClimbingStairs(self, cost)::type cost: List[int]:rtype: intdp [0] * (len(cost) 1)dp[0] 0 # 初始值表示从起点开始不需要花费体力dp[1] 0 # 初始值表示经过第一步不需要花费体力for i in range(2, len(cost) 1):# 在第i步可以选择从前一步i-1花费体力到达当前步或者从前两步i-2花费体力到达当前步# 选择其中花费体力较小的路径加上当前步的花费更新dp数组dp[i] min(dp[i - 1] cost[i - 1], dp[i - 2] cost[i - 2])return dp[len(cost)] # 返回到达楼顶的最小花费二、dp v2
class Solution(object):def minCostClimbingStairs(self, cost)::type cost: List[int]:rtype: intdp00dp10for i in range(2,len(cost)1):dp2min(dp1cost[i-1],dp0cost[i-2])dp0dp1dp1dp2return dp2