[蓝桥杯专栏]动态规划入门

简介:

动态规划(Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。

讲解动态规划的文章已经非常多了,本专栏将采用python实现,讲解部分蓝桥杯和洛谷上面的练习题

一般用于解决最优问题


核心思想

利用过往的信息,把问题拆解成若干个子问题,逐步求解

利用曾经的历史信息,常用一个一维数组或者二维数组来表示dp数组,里面的参数就是过往信息,比如斐波那契数列就是以前数字的大小


常用思路:

下面来看看动态规划的基本思路

1. 分析dp数组及其下标含义,初始化,确认问题的状态,拆解为若干个子问题,通常是从后向上寻找。

2.找到递归公式,就是不同子问题之间的关系,注意遍历顺序(在背包问题时候会详细说到)

递归公式是动态规划的核心

3.找到终止条件,求得结果


简单例子:

比如常见的最简单的动态规划斐波那契数列,首位为1,次位为1,求出第n位的数字

按照上面的思路

1.问题是求出最后的数字,可转换为从第三位开始逐步向后求解,即用一个一维数组来代表dp数组,数组的含义是每个位置的数字,下标为第几位数

2.递归公式 f(n) =  f(n-1)+f(n-2)

                   f(n-1)=f(n-2)+f(n-3)

                      ……

                    f(3) = f(1) +f(2)

                    f(1) = f(2) = 0

3.按照题目要求输出第n位数字

代码如下

n=int(input())
def feibo(n):
    if n<=1:
        return n
    else:
        return(feibo(n-1)+feibo(n-2))
for i in range(int(n)):
    print(feibo(i),end=' ')

你可能感兴趣的:(动态规划,数据结构和算法,蓝桥杯练习,蓝桥杯,python,数据结构,动态规划)