#### 递归、回溯、dfs、动态规划、贪心、分治

(注意内容来自摘录)

前言:分类算法刷题请见:代码随想录

0.概述

【递归】递归就是自我调用,经常作为一种编程的实现方式,比如题主问题中的DFS 、动态规划、回溯法都可以用递归来实现,当然也可以用非递归来实现。很多时候一个概念也可以用递归的方式来定义(比如gnu)。

【回溯】回溯是一种通用的算法,把问题分步解决,在每一步都试验所有的可能,当发现已经找到一种方式或者目前这种方式不可能是结果的时候,退回上一步继续尝试其他可能。很多时候每一步的处理都是一致的,这时候用递归来实现就很自然。

【dfs】当回溯用于树的时候,就是深度优先搜索。当然了,几乎所有可以用回溯解决的问题都可以表示为树。那么这俩在这里就几乎同义了。如果一个问题解决的时候显式地使用了树,那么我们就叫它dfs。很多时候没有用树我们也管它叫dfs严格地说是不对的,但是dfs比回溯打字的时候好输入。别的回答里提到了砍枝,实际上这二者都可以砍枝。

【dp】至于动态规划,被题主放到这里是因为都是竞赛中经常会遇到并且学起来不容易明白吗?回溯可以用于所有用穷举法可以解决的问题,而DP只用于具有最优子结构的问题。所以不是所有问题都适合用dp来解决,比如八皇后。dp需要存贮子问题的解,回溯不需要。

【贪心和分治】动态规划与贪心可以看作分治的特例,而分治几乎都是以递归的形式呈现的。

1、动态规划 与 回溯

(1)动态规划算法的备忘录方法和回溯法有什么区别? - 知乎

(2)https://www.cnblogs.com/zoyu/p/16472919.html

2、 贪心例子

题目:

. - 力扣(LeetCode)

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

贪心算法答案:

func maxProfit(prices []int) (ans int) {
    for i := 1; i < len(prices); i++ {
        ans += max(0, prices[i]-prices[i-1]) // 主要逻辑
    }
    return
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态规划回溯贪心分治是常见的算法思想和方法。 动态规划是一种解决多阶段决策最优化问题的方法。在动态规划中,问题被分解为多个子问题,通过找到子问题的最优解,然后将这些最优解组合起来得到原问题的最优解。引用中提到了一个例子,即解决凸多边形的最优三角形划分问题。 回溯是一种试探性的搜索算法,它通过穷举所有可能的解,逐步回溯并检查每个可能的解是否满足问题的要求。回溯法通常使用递归实现,每次选择一种可能的路径进行搜索,如果不满足条件,则回退到上一步继续搜索其他可能的路径。引用中提到了回溯法的自动完成特性,即回溯的过程是在程序运行时自动完成的。 贪心算法是一种基于当前局部最优选择的方法。在贪心算法中,每一步都选择当前看起来最好的选项,并以此希望最终能够达到全局最优解。然而,贪心算法并不能保证总是能得到全局最优解,因为它没有考虑到未来可能的情况。引用中举了一个求组合出特定金额的硬币最少所需张数的例子,其中提到了贪心算法只关注当前的最优解。 分治是将问题分解成多个子问题,并且对每个子问题进行独立求解,最后将子问题的解合并得到原问题的解。分治算法通常使用递归实现,每次将问题分解为更小的子问题,直到问题可以直接求解为止。引用中提到了分治算法作为解决凸多边形的最优三角形划分问题的一种思路。 总结,动态规划回溯贪心分治是不同的算法思想和方法,适用于不同类型的问题。动态规划通过寻找子问题的最优解来解决多阶段决策问题,回溯通过穷举所有可能的解来解决问题,贪心通过选择当前局部最优解来解决问题,而分治通过将问题分解为多个子问题并逐个求解再合并解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值