算法设计与分析--动态规划

Why?为什么用动态规划

分治技术的问题:

  子问题是相互独立的

  如果子问题不是相互独立的,分治算法将重复计算公共子空间,效率很低

提高效率的方法:

  从规模最小的子问题开始计算

  用恰当数据结构存储子问题的解,供以后查询

  确保每个子问题只求解一次

优化问题:

  给定一组约束条件和一个代价函数,在解空间中搜索具有最小或最大代价的优化解

  很多优化问题可分为多个子问题,子问题相互关联,子问题的解被重复使用

What?什么是动态规划

动态规划算法特点

  把原始问题划分成一系列子问题

  求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时直接存取,不重复计算,节省计算时间

  自底向上地计算

适用范围:

  一类优化问题:可分为多个相关子问题,子问题的解被重复使用

How?怎么做动态规划

使用Dynamic Programming的条件

  Optimal substructure(优化子结构)

    当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有优化子结构

    缩小子问题集合,只需那些优化问题中包含的子问题,减低实现复杂性

    优化子结构使我们能自下而上地完成求解过程

  Subteties(重复子问题)

    在问题的求解过程中,很多子问题的解将被多次使用

动态规划算法的设计步骤

  分析优化解的结构

  递归的定义最优解的代价

  自底向上的计算优化解的代价保存之,并获取构造最优解的信息

  根据构造最优解的信息构造优化解

Longest Common Subsequence

问题的定义

子序列:X=(A,B,C,B,D,B),Z=(B,C,D,B)是X的子序列,W=(B,D,A)不是X的子序列。

公共子序列:Z是序列X与序列Y的公共子序列如果Z是X的子序列也是Y的子序列。

最长公共子序列(LCS)问题:

  输入:X=(x1,x2,...,xn),Y=(y1,y2,...,ym)

  输出:Z=X与Y的最长公共子序列

分析优化解的结构

 

有优化子结构,子问题有重叠性,采用动态规划。

建立LCS长度的递归方程

 

 

自底向上计算LCS的长度

 构造优化解

 

 

posted @ 2020-03-30 17:08  这是一个ID  阅读(304)  评论(0编辑  收藏  举报