四大常用算法:分治、贪心、回溯、动态规划

回溯算法是个“万金油”。基本上能用跟动态规划、贪心解决的问题,都可以用回溯去解决。回溯算法相当于穷举搜索,穷举所有情况,然后得到最优解。不过回溯算法时间复杂度非常高,指数级的,只能解决小规模数据问题。对于大规模数据,执行效率就相当低。

void backtracking(参数) {
if (终止条件) {
存放结果;
return;
} for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}

动态规划算法高效,但并不是所有问题都可以用动态规划来解决,必须满足三个特征,最优子结构、无后效性和重复子问题。在重复子问题上,动态规划和分治算法的区分很明显,分治算法分割成的子问题,不能有重复子问题,而动态规划则相反,之所以高效,就是因为回溯算法实现中存在大量重复子问题。DP问题一定是分阶段问题。动态规划其实就是一种遍历,但是他是带备忘录的遍历,对于前面算到的子问题,仅就不在计算而是直接查看备忘录

贪心算法算是动态规划的一种特殊情况。解决问题更加高效,代码实现更简洁,不过他解决问题也更加有限。他能解决的问题必须满足三个条件,最优子结构,无后效性和贪心选择性。其中,最优子结构和无后效性跟动态规划无异,贪心选择性,就是通过局部最优选择,能产生全局最优选择。每一个阶段,我们都选择当前最优的决策,所有阶段的决策完之后,最终由这些局部最优解构成全局最优解。

  • 最优子结构:问题的整体最优解包含着它的子问题(某一个但不是全部子问题)的最优解。每一步贪心选完后会留下子问题,子问题的最优解和贪心选出来的解可以凑成原问题的最优解
  • 贪心选择性:整体的最优解可通过一系列局部最优解达到。每一步贪心选出来的一定是原问题的最优解的一部分
  • 无后效性:某阶段的状态旦确定,则此后过程的演变不再受此前各状态及决策的影响。也就是说,“未来与过去无关”,当前的状态是此前历史的一个完整的总结,此前的历史只能通过当前的状态去影响过程未来的演变。

贪心VS动态规划

贪心:每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留;

动态规划:全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解 。

举例说明:也就是说,假如你要求第十步的最优解,那么第十步的最优解肯定与第九步的最优解有关,而第九步的最优解肯定与第八步的最优解有关。可以这么理解,贪心算法第十步的最优解得把前面九步的最优解都用上了,但是动态规划你需要求第十步的最优解,这个最优解可能只与第八步,第三步,第一步有关,与第九步没有关系,我们为什么选择第八步而不选择第九步呢?是因为我们在计算第十步的最优解的时候其实把1-9步的组合的情况都计算了,选择了其中最优的解,也就是第八步的解,其实第十步解的构成与第九步没有关系,动态规划相当于穷举了1-9步最优情况下的组合,选了其中最优的作为第十步的最优解,而贪心算法第十步的最优解肯定是由第九步构成的。

回溯、贪心、DP的区别和联系的更多相关文章

  1. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  2. BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP

    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...

  3. 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp

    正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...

  4. 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp

    题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...

  5. profibus总线和profibus dp的区别

    profibus总线和profibus dp的区别:PROFBUS是一种国际性的开放式的现场总线标准,它既可以用于高速并且对于时间苛求的数据传输,也可以用于大范围的复杂通讯场合.PROFBUS-DP是 ...

  6. 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp

    题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...

  7. hdu 1257 最少拦截系统【贪心 || DP——LIS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  8. 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人

    P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...

  9. 贪心+dp

    贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思 ...

  10. 【题解】CF1056F Write the Contest(三分+贪心+DP)

    [题解]CF1056F Write the Contest(三分+贪心+DP) 最优化问题的三个解决方法都套在一个题里了,真牛逼 最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的( ...

随机推荐

  1. VSCode 安装以及初步使用教程

    老样子先介绍一下VSCode(是什么?干什么?有什么用?好处是什么?等) VisualStudioCode(简称VSCode)是Microsoft开发的代码编辑器,它支持Windows,Linux和m ...

  2. Ubuntu安装python固定版本

    一. 安装python3.7 本篇文章使用python3.7安装步骤为例 1.直接使用apt-get安装python3.7 apt-get install python3.7 该方法经常会出现unab ...

  3. go-zero微服务实战系列(三、API定义和表结构设计)

    前两篇文章分别介绍了本系列文章的背景以及根据业务职能对商城系统做了服务的拆分,其中每个服务又可分为如下三类: api服务 - BFF层,对外提供HTTP接口 rpc服务 - 内部依赖的微服务,实现单一 ...

  4. flink窗口分类

    窗口分类 按照驱动类型分类 窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息就是"怎样截取数据".换句话说,就是以什么标准来开发和结束数据的截取. 按照驱动类型分类主要 ...

  5. 24.Haproxy搭建Web群集

    Haproxy搭建Web群集 目录 Haproxy搭建Web群集 Haproxy简介 常见的Web集群调度器 软件类 硬件类 Haproxy应用分析 HAProxy的主要特性 HAProxy常见的8种 ...

  6. JS:&&运算符

    &&逻辑运算符 当&&连接语句时,两边的语句会转化为布尔类型 1.两边条件都为true时,结果才为true: 2.如果有一个为false,结果就为false: 3.当第 ...

  7. colab简易使用

    解压文件(zip文件) !unzip -o /content/drive/MyDrive/test.zip -d /content/ 解压test.zip到指定目录, 其他解压缩命令: linux-常 ...

  8. Linux shell 2>&1的意思

    在脚本里经常看到 ./xxx.sh > /dev/null 2>&1 ./xxx.sh > log.file 2>&1 在shell中输入输出都有对应的文件描述 ...

  9. RPA应用场景-日终清算操作

    场景概述 日终清算操作 所涉系统名称 登记过户管理系统(TA),投资交易系统(032) 人工操作(时间/次) 60-80分钟 所涉人工数量 2 操作频率 每日 场景流程 这两个流程一般在晚上8-9点开 ...

  10. HTML:<input type="text"> 输入数字时的验证!(在提交时验证)

    <!--非负数:<input type="text" name="" pattern="^\d+$">--> < ...