算法系列之动态规划

举报
坚果派 发表于 2022/06/18 08:49:50 2022/06/18
1k+ 0 0
【摘要】 动态规划简介动态规划是一种实用的技巧,它可以用来解决一系列特定问题。它的思路很简单,如果你对某个给定的输入解决了一个问题,那么你可以保存已有信息,以避免重复计算,节约计算时间。解决问题的方式自顶向下 : 利用分支策略分解问题。如果你已经解决过当前子问题了,那么就返回已有信息。如果当前子问题没有计算过,那么就对它进行计算。这样的方法很易于思考、很直观。这被称作“记忆化”。自底向上 : 首先分析...

动态规划

简介

动态规划是一种实用的技巧,它可以用来解决一系列特定问题。它的思路很简单,如果你对某个给定的输入解决了一个问题,那么你可以保存已有信息,以避免重复计算,节约计算时间。

解决问题的方式

  1. 自顶向下 : 利用分支策略分解问题。如果你已经解决过当前子问题了,那么就返回已有信息。如果当前子问题没有计算过,那么就对它进行计算。这样的方法很易于思考、很直观。这被称作“记忆化”。

  2. 自底向上 : 首先分析问题,将问题分解为不同规模的问题,并决定它们的顺序,按顺序计算,直到解决给定规模的问题。这样的流程可以保证在解决较大的问题之前解决(它所依赖的)较小的问题。这种流程被称作“动态规划”。

动态规划的例子

最长上升子序列问题。给定S= {a[1] , a[2] , a[3], a[4], ............., a[n-1], a[n] },求出一个子序列,使得对于所有在这个子序列中所有满足j<iji,满足aj<ai。首先我们要讨论以原序列的第i个元素结尾的最长上升子序列dp[i]。那么答案是整个dp序列的最大值。考虑dp[i],它的最后一个元素为a[i]。枚举它的倒数第二个元素a[j],则a[j]<a[i]成立。则dp[i]就是所有这样的dp[j]的最大值加上1(最后一个元素)。这个算法具有O(n^2)的时间复杂度。

此算法的伪代码:

for i=0 to n-1
    dp[i]=0
    for j=0 to i-1
        if (a[i] >  a[j] and dp[i]<dp[j])
            LS[i] = LS[j]
    dp[i]=dp[i]+1
for i=0 to n-1
    if (largest < dp[i])
        largest = dp[i]

这个算法的复杂度可以通过将数组换为其他数据结构来优化,来获得O(n * log n)的时间复杂度。

同样的思路可以求出有向无环图上的最大路径。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。