一、动态规划算法介绍
动态规划(Dynamic Programming,简称DP)是一种常用的优化问题求解方法,它通过将原问题拆分为若干子问题,并保存子问题的解,以便在需要时进行查找,从而避免重复计算,提高算法效率。动态规划算法通常适用于具有重叠子问题和最优子结构性质的问题。重叠子问题指的是原问题的解可以通过一系列子问题的解来表示,而这些子问题在求解过程中可能会被多次重复计算。最优子结构性质指的是原问题的最优解可以由其子问题的最优解推导得到。
二、基本步骤
动态规划算法的基本思想是:从最简单的子问题开始,逐步解决规模更大的子问题,最终得到原问题的解。具体步骤如下:
-
确定状态:将原问题划分为若干个子问题,并确定每个子问题的状态。状态是描述子问题的变量,可以是一个或多个变量。
-
确定状态转移方程:通过分析子问题之间的关系,建立子问题的状态转移方程。状态转移方程描述了子问题之间的转移关系,即如何通过已知的子问题的解来求解当前子问题的解。
-
初始化:确定初始条件,即最简单的子问题的解。
-
递推求解:按照状态转移方程,从最简单的子问题开始逐步求解规模更大的子问题,直到求解出原问题的解。
-
记忆化搜索/自底向上求解:为了避免重复计算,可以使用记忆化搜索或自底向上的方法,将子问题的解保存起来,以便在需要时进行查找。
-
求解原问题:根据子问题的解,得到原问题的解。
动态规划算法的时间复杂度通常是子问题个数乘以解决一个子问题所需的时间,即O(nk),其中n为问题规模,k为状态数。动态规划算法常用于求解最优化问题,如最长递增子序列、背包问题、最短路径等。
三、爬楼梯问题
1.思路展示
例:假设你正在爬楼梯,需要4阶你才能到达楼顶,每次你可以爬 1
或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
思路:爬楼梯问题本质上为差分方程问题,在做题时可先将其转化为问题抽象化,建立差分方程,其次求出初始解,该问题即可得到解决。
求解:
步骤一:将该问题抽象化并建立方程
为到第n阶台阶的方法数,建立方程为:
步骤二:定义初始解
综上,到达顶层共有5种方法。
2.力扣题目代码应用
2.1题目描述
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/climbing-stairs/description/
2.2题目示例
示例1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
2.3题目求解
class Solution:
def climbStairs(self, n: int) -> int:
a=[0]*n
a[0]=1
if n==1:
return a[0]
a[1]=2
for i in range(2,n):
a[i]=a[i-1]+a[i-2]
return( a[-1])
2.4结果展示