希赛考试网
首页 > 软考 > 系统分析师

动态规划经典例题

希赛网 2023-12-08 13:38:02

动态规划(Dynamic Programming,简称 DP)是解决一类最优化问题的一种算法思想,适用于求解具有重叠子问题和最优子结构性质的问题。动态规划的算法思想就是将问题分成若干小问题,寻找最优解,并以此为基础,逐步求解大问题,最终得到整个问题的最优解。

动态规划问题的求解一般包括三个步骤:

1. 设计状态:确定哪些因素(状态变量)对问题产生影响,以及如何表示状态变量,通常用一维或多维数组表示。

2. 状态转移:根据问题的性质和状态变量之间的关系,设计状态转移方程,用来描述问题的最优解如何从一种状态转移到另一种状态。

3. 确定边界:问题的边界条件即为最终的解,需要先将边界条件处理好,才能用状态转移方程进行递推,得到问题的最优解。

下面,我们将通过一个动态规划经典例题来详细讲解动态规划的具体应用。

例题描述:

假设有一座山,山上有若干个点,每个点有一定的高度,从山的任意一边上山,可以走多段路线到达山顶,某位登山爱好者希望从山脚到达山顶,且要求爬升高度最小。现在请你设计一个算法,计算最小爬升高度并输出具体路径。

我们可以描述这个问题:

设从第 i 个点到山顶的最小爬升高度为 f(i)。我们可以枚举前一点 j(i>j),设最小爬升高度为 g(i,j),则:

$$

f(i)= \min_{j(i>j)}\{g(i,j)\}+h(i)

$$

其中,h(i)表示第 i 个点的高度。

则有:

$$

g(i,j)= \max\{h(i)-h(j),g(j,k)\}

$$

其中,j < k并且包含沿途所有点。

通过逆推法,我们可以得出动态规划所需要的三个步骤,具体如下。

1. 设计状态

状态变量为 f(i)。

2. 状态转移

根据问题描述中的转移方程式,可以得出状态转移方程式为:

$$

f(i)= \min_{j(i>j)}\{\max\{h(i)-h(j),f(j)\}\}+h(i)

$$

3. 确定边界

我们可以使用逆推法来确定边界条件,即为 f(t)=h(t),其中,t 表示山顶的位置。

代码实现如下:

```python

def dp():

for i in range(n-2,-1,-1):

for j in range(i+1,n):

small = min(small,height[j])

f[i] = min(f[i],f[j]+small)

```

其中,n 表示点的个数,height 数组存储每个点的高度,f 数组存储每个点到山顶的最小爬升高度。

通过上面的代码可以得到最小爬升高度,但是还需要输出具体路线。

代码实现如下:

```python

def print_route():

ans[0] = 0

top = 1

for i in range(1,n):

if f[i] < f[ans[top-1]]:

ans[top] = i

top += 1

elif height[i] <= height[ans[top-1]]:

ans[top-1] = i

else:

l = 0

r = top-1

while l < r:

mid = (l+r)//2

if height[i] > height[ans[mid]]:

r = mid

else:

l = mid+1

ans[l] = i

for i in range(top):

print(height[ans[i]])

```

其中,ans 数组记录路径上每一个点的下标,top 表示当前路径长度。

综上所述,动态规划算法的具体应用可以通过以上案例详细了解,可以根据方程自由组合具体应用于不同领域的问题中。动态规划求解问题的过程中,可以利用计算机算力进行方程求解,同时也需要考虑算法的效率和正确性。

系统分析师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
系统分析师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件