这是我参与8月更文挑战的第十五天,活动详情查看:8月更文挑战”
大家好,今天我们要聊的是动态规划这种方法,它和分而治之一样,也是算法设计中的一种方法,你同样可以把它当作解决问题的一种思路。接下来让我来看看动态规划是什么?
动态规划
-
动态规划是算法设计中地一种方法。
-
它将一个问题分解为
相互重叠的子问题,通过反复求解子问题,来解决原来的问题。 -
看到这,你会发现它分而治之是一样的。其实不然,分而治之,是把问题分解成相互独立的子问题,而动态规划是把问题分解成相互重叠的子问题。
那什么是相互重叠呢?
可以给大家举一个很典型的列子。
- 斐波那契数列
从第三个数开始,所有值都等于它前个两个值之和。
那怎么解决斐波那契数列呢?
这个时候就要用到动态规划了。
-
定义子问题:F(n) = F(n - 1) + F(n - 2)
-
反复执行:从2循环到n,执行上述公式。
这时候我们发现每个子问题都是一套公式,通过这套公式反复求解,这就是相互重叠的。
LeetCode:70.爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
解题思路
-
爬到第n阶可以在第 n - 1 阶爬一个台阶,或者在第 n - 2 阶爬2个台阶。
-
F(n) = F(n - 1) + F(n - 2)
function climbStairs(n: number): number {
if(n < 2) return 1;
const dp = [1, 1]
for(let i = 2; i <= n;i ++) {
dp[i] = dp[i - 1] + dp[i -2]
}
return dp[n]
};
End~~~