动态规划算法(25.1.27)

写在前面:已经有半年在忙计算机四大件了,算法可以说是除了10月份看了看代码随想录的题并跟着写了点题之外一点题都没做。1月末开始重拾算法,打算用点时间从做题曲成为algorithm高手,在那些中学就开始接触算法然后故意在我们零基础高考er面前大声讨论“茴字的写法”的OIer面前可以不再装死。

0.前置了解:递归思想以及相关题目(详解递归思想-CSDN博客)

1.动态规划算法基础概念:

最简单的例子:斐波那契额数列。f(n)=f(n-1)+f(n-2) 

 特点是:知道前一个(几个)状态的最优解才能通过状态转移方程得到这个状态的最优解,斐波那契数列的状态转移方程是简单的线性方程。

              (1)状态(最优解)数组:dp[i]表示前i个元素的最优解,dp[i,j]表示在位置(i,j)处的最优解

              (2)状态转移方程:通过状态转移方程可知前i个元素的最优解/位置(i,j)处的最优解是怎么从已知的最优解运算得到的。

              (3)初始化边界条件:最初状态的最优解。

抓手:1.可以看到动态规划是通过将已经计算得到的最优解存下来,在下一次用到时直接从存储的数据结构中取出并直接使用,是空间换时间。

          2.通常情况下只能得到最优解的个数,因为存储的总是一个指向实数的映射,所以这个实数的定义就十分重要,通常为个数。

2.DP的核心前置条件:什么问题用DP

(1)最优子结构:问题最优解包含子问题最优解:问题的最优解是一个个子问题最优解一个个推出来的。

(2)重叠子问题:子问题会被多次重复计算,这就为空间换时间提供应用场景。

3.DP实现方式(处理顺序):

(1)TOP-DOWN(递归)

以斐波那契数列为例:要求f(n),就要知道f(n-1)、f(n-2)......以此类推到要知道f(1)、f(2)。

使用递归思想、原问题开始递归分解为子问题同时使用哈希表或是数组记录子问题的解、由已知的解顺次计算出(状态转移方程)未知的解。

(2)Bottom-Up(迭代)

  怎么处理顺序不是特别重点。

4.重点:刷题

1.背包问题:

2.最长公共子序列问题:

3.最短路径问题:

你可能感兴趣的:(算法,动态规划)