HOME/Articles/

动态规划入门

Article Outline

动态规划入门(DAY-1)

Q1. 斐波那契数

题目描述:该数列由 01 开始,后面的每一项数字都是前面两项数字的和。

由题可知,斐波那契数列的边界条件是nullnull,每一项的和都等于前两项的和,递推关系为null

解法1 递归

def fibo(n):
    if n==0 or n==1:
         return n 
    return (fibo(n-1)+fibo(n-2))

解法2 动态规划

滚动数据思想,如下图所示[图显示不出来了]

null

def fibo(n):
    if n<2:
        return n
    p, q, r = 0, 1, 0  # 这里是初始化数组,p、q为初始0,1值,r是计算结果
    for i in range(2, n + 1):   # 循环条件为 从2开始
        r = p + q    # 计算条件
        p, q = q, r  # 数组滚动
    return r

心得:这道题十个月前做过,但是还是只会递归的方法,关于动态规划的思路,有点不清晰。

Q2 第 N 个泰波那契数

题目描述 泰波那契序列 Tn 定义如下: T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

由题可知,斐波那契数列的边界条件是null,nullnull,每一项的和都等于前三项的和,递推关系为null

解法:动态规划

def fibo(n):
    if n==0:
        return 0
    if n==1 or n==2:
        return 1

    p, q, r, s = 0, 1, 1, 0  # 这里是初始化数组,p、q为初始0,1值,r是计算结果`  
    for i in range(2, n + 1):   # 循环条件为 从2开始`  
        r = p + q + s    # 计算条件`
        p, q, r = q, r, s  # 数组滚动` 
    return r`

**心得**:和Q1一模一样,加强记忆了,这种数组感觉像队列,依次出队列的感觉,也像滑动窗口,依次滚动的感觉。