动态规划算法

定义

从字面意义上去看,动态规划觉得比较难,对于动态规划来说,动态规划理解了思想,掌握基本的模型,然后再加上写代码的套路,动态规划就游刃有余。

本质

求解决策过程最优化的数学方法

适用条件

1、最优化原理(最优子结构性质)
一个最优化策略具有这样的性质,不抡过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须是最优策略。简而言之,一个最优的子策略也是最优的,一个问题满足最优化原理又称其具有最优子结构性质。
2、无后效性
将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它之前各阶段的状态无法直接影响它未来的决策,而只能通过当前这个状态。换句话说,每个状态都是过去历史的一个完整总结。 这就是午后向性,又称为无后效性。
3、子问题的重叠性
动态规划算法的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其他的算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间。

思想和性质

首先,动态规划最重要的是掌握他的思想,动态规划的核心思想是把原问题分解成子问题进行求解,也就是所谓的分治的思想。
什么问题适合动态规划呢?我们通过一个现实的例子

组织架构图
首先是重叠子问题,不同的问题,可能都要求1个相同问题的解。假如A经理2想知道他下面最优秀的人是谁,他必须知道X,Y,Z,O,P组

### 动态规划算法流程图解析 动态规划是一种解决多阶段决策问题的有效方法,其核心在于通过分解问题并存储子问题的解来避免重复计算。以下是动态规划算法的主要步骤及其对应的流程图解析: #### 1. **定义状态** 定义状态是指将原问题划分为若干个子问题,并找到描述这些子问题的状态变量。这一步骤决定了后续所有操作的基础[^2]。 #### 2. **建立状态转移方程** 建立状态转移方程是动态规划的核心部分。它表示如何从前一阶段的状态推导到当前阶段的状态。通常形式如下: \[ dp[i] = f(dp[i-1], ..., dp[0]) \] 这里的 \(f\) 是某种特定的操作或函数,比如加法、乘法或者取最大/最小值等[^2]。 #### 3. **初始化边界条件** 边界条件指的是那些可以直接得出结果而无需进一步递归的情况。例如,在斐波那契数列中,\(F(0)\) 和 \(F(1)\) 就属于边界条件[^1]。 #### 4. **执行迭代计算** 根据前面定义好的状态转移方程以及初始值,依次计算各个状态下的最优解直到最终目标状态为止[^2]。 #### 5. **返回最终答案** 当所有的必要状态都被计算完毕之后,就可以从中提取出我们所需要的最终解答了[^2]。 下面是基于上述五个步骤绘制的一个简化版动态规划算法流程图示意图: ```plaintext 开始 -> 定义状态 -> 初始化边界条件 -> |-> 建立状态转移方程 -> 执行迭代计算 -> 结束 <- 返回最终答案 ``` 此图为逻辑上的顺序展示,并未具体体现每步内部细节;实际应用时需依据具体场景调整各环节的具体实施方式。 ### 示例代码片段 (Python 实现最长公共子序列 LCS) 为了更清楚地理解动态规划的工作机制,这里给出一个经典的例子——寻找两个字符串之间的最长公共子序列(LCS),并通过 Python 编码实现该过程: ```python def lcs(X, Y): m = len(X) n = len(Y) # 创建二维数组用于保存中间结果 L = [[None]*(n + 1) for i in range(m + 1)] """构建L[m+1][n+1]""" for i in range(m + 1): for j in range(n + 1): if i == 0 or j == 0 : L[i][j] = 0 elif X[i-1] == Y[j-1]: L[i][j] = L[i-1][j-1]+1 else: L[i][j] = max(L[i-1][j], L[i][j-1]) return L[m][n] X = "AGGTAB" Y = "GXTXAYB" print("Length of LCS is ", lcs(X,Y)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhiguoXue_IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值