「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」
动态规划一直都是一个难点,最近有空刚好刷刷看看
[斐波那契数]
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
提示:
0 <= n <= 30
解题思路:
- 动态规划是解决具有重叠子问题的特殊分治
- 根据以上思路查看当前题是符合动态规划的。
- 定义dp数组
- 先将补充dp数据 赋值n+1个0占位
- 判断特殊情况 0 1 2 这三个位,0 的时候dp[0] == 0 dp[1] = 1 dp[2] =1
- 之后运算公式dp[i]=dp[i-1]+dp[i-2]
- db[-1]即为我们要的值
class Solution:
def fib(self, n: int) -> int:
if n == 0:
return 0
if n == 1 or n==2:
return 1
dp = [0] * (n+1)
for i in range(0, n+1):
if i == 0:
dp[i] = 0
elif i == 1 or i == 2:
dp[i] = 1
else:
dp[i] = dp[i-1] + dp[i-2]
return dp[-1]
执行结果:
[第 N 个泰波那契数]
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
示例 1:
输入:n = 4 输出:4 解释: T_3 = 0 + 1 + 1 = 2 T_4 = 1 + 1 + 2 = 4 示例 2:
输入:n = 25 输出:1389537
提示:
0 <= n <= 37 答案保证是一个 32 位整数,即 answer <= 2^31 - 1。
解题思路:
- 几乎和上一题思路一样,同样使用动态规划方法
- 先初始化dp数组
- 遍历数组,判断特殊情况row ==0 row ==1 row ==2
- 其他情况根据计算方程式dp[row] = dp[row-1]+dp[row-2]+dp[row-3] 进行依次计算
- 最后获取dp[-1] 获取最后一个值就是我们想要的结果了
class Solution:
def tribonacci(self, n: int) -> int:
dp=[0 for row in range(n+1)]
for row in range(0,n+1):
if row == 0:
dp[0] = 0
elif row == 1 or row ==2:
dp[row] =1
else:
dp[row] = dp[row-1]+dp[row-2]+dp[row-3]
return dp[-1]
执行结果: