算法设计学习笔记(六)——动态规划

这篇博客详细探讨了动态规划的概念,包括带权区间调度、动态规划原理、分段最小二乘、子集和与背包问题、RNA二级结构、序列比对以及图中的最短路径等实际应用。通过递归算法、备忘录法和迭代法阐述了动态规划的求解策略,并分析了算法的时间复杂度和空间复杂度,为读者提供了深入理解动态规划的路径。
摘要由CSDN通过智能技术生成

动态规划

目录

动态规划

一、带权的区间调度(一个递归过程)

二、动态规划原理:备忘录或者子问题迭代 

三、分段的最小二乘:多重选择

四、子集和与背包:加一个变量

五、RNA二级结构:在区间上的动态规划

六、序列比对

七、图中的最短路径

八、最短路径和距离向量协议

九、图中的负圈


 

一、带权的区间调度(一个递归过程)

1.问题

有n个需求,每个需求有一个开始时间 s_{i} 和一个结束时间 f_{i} ,每个区间i还有一个值(或者权)\small v_{i},我们的目标是接收一个两两相容得区间子集S\subseteq \{​{1,...,n}\},使得所选区间得值之和 \small \sum_{i\in S} v_{i} 为最大。

2.设计与分析算法

此次的区间调度问题不再是所有值都为1的特殊情况,因此读多数贪心算法不能优化地求解这个问题。

二分选择:区间n属于一个最优解或者不属于一个最优解。

1)递归算法:

  • 将需求按结束时间升序排列,即:f_{1}\leq f_{2}\leq ...\leq f_{n}.
  • 对每一个区间j,在集合 \{​{1,2,...,j}\} 中选取与区间 j 不相交的且结束时间最大的区间,定为 p(j).
  • 对需求 \{​{1,2,...,j}\} 求解最优解,令 OPT(j) 为这个解的值,O(j) 表示最优解,可得

定理6.1  OPT(j) = max(v_{j} + OPT(p(j)),OPT(j-1)).

定理6.2 需求j 属于集合\{​{1,2,...,j}\}上的最优解当且仅当 v_{j}+OPT(p(j))\geq OPT(j-1)

  • 自顶而上,求出所有使权值之和变为最大的需求。

 OPT(n)递归算法:

Compute-Opt(j)

If j=0 then

     返回0

Else

     返回 max(v_{j} + Compute-Opt(p(j)),Compute-Opt(j-1))

Endif

 算法的正确性直接由在j上的归纳得到:

定理6.3 对每个j=1,2,...,n,Compute-Opt(j) 正确地计算了OPT(j)

存在的问题:最坏情况下将用指数时间运行(Fibonacci数)

2)递归的备忘录形式

备忘录:存储以算好的值

M-Compute-Opt(j)

If j=0 then

     返回0

Else if M[j] 不空 then

     返回M[j]

Else

     定义M[j]=max(v_{j} + M-Compute-Opt(p(j)),M-Compute-Opt(j-1))

     返回M[j]

Endif

定理6.4 M-Compute-Opt(n) 的运行时间是O(n)(假定输入区间按它们的最后时间存储) 

3)获取最优解

利用上述算法,我们仅获得了一个最优解的值,而除了值,我们也想要一组最优的区间。 可以通过数组M“反向追踪”来找出最优解中的区间集合。

Find-Solution(j)

If j=0 then

     什么也不输出

Else

     if v_{j}+M[p(j)]\geq M[j-1]  then

            输出j与Find-Solution(p(j))的结果

     Else

            输出 Find-Solution(j-1)的结果

     Endif

Endif

定理6.5  给定这些子问题的最优值的数组M,Find-Solution 在O(n) 时间内返回一个最优解 

二、动态规划原理:备忘录或者子问题迭代 

动态规划的基本原理:

子问题上迭代,而不是递归地计算解

先设计了一个指数时间的递归算法,然后把它转换成一个有效的递归算法

1.设计算法:

数组M[n]包含了整个实例的最优解的值,并且可以用Find-Solution通过M有效地向后追踪并且返回最优解本身。

因此我们可以不使用备忘录式的递归,通过迭代算法直接计算M中的项。

Iterative-Compute-Opt

M[0] = 0

For i=1,2,...,n

 M[j]=max(v_{j}+M[p(j)],M[j-1])

Endfor

 2.分析算法

Iterative-Compute-Opt 运行时间为 O(n) ,它清楚地运行了n次迭代并且每次迭代用常数时间。

3.动态规划的基本要点

(i) 只存在多项式个子问题

(ii)可以容易地从子问题地解计算初始问题的解

(iii)在子问题从“最小”到“最大”存在一中自然的顺序,与一个容易计算的递推式相联系,这个递推式允许人们从某些更小的子问题的解来确定一个子问题的解。

三、分段的最小二乘:多重选择

1.分段的最小二乘问题

给定一组点 P = \{​{(x_{1},y_{1}),(x_{2},y_{2},...,(x_{n},y_{n})}\},具有 x_{1}< x_{2}< ...< x_{n},我们用P_{i} 表示点(x_{i},y_{i}).我们首先把P划分成若干端,每段是P的一个子集,表示连续的x坐标的集合,即对每个下标 i< j ,集合为\{​{p_{i},p_{i+1},...,p_{j-1},p_{j}}\}.那么,对于在P的划分中的每段S,我们按

                                                       y = ax+b,a=\frac{n \sum_{i}x_{i}y_{i} - ( \sum_{i} x_{i})( \sum_{i} y_{i})}{n \sum_{i}x_{i}^2-( \sum_{i}x_{i})^2},b=\frac{ \sum _{i}y_{i}-a\sum_{i}x_{i}}{n}

计算相对于S中点的误差最小的直线.

一个划分的罚分定义为下面的项之和

(i)我们划分P的段数乘以一个给定的不变因子C> 0

(ii)对每段,通过那个段的最优直线的误差值

问题的目标是找一个最小罚分的划分。

2.设计算法

最后一个点 p_{n} 在最优化分中属于一段,并且那个段在某个比较早的点p_{i}开始。

定理6.6 如果最优化分的最后一段是p_{i},...,p_{n},那么最优解的值是:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值