关于动态规划和回溯的一些理解

一、动态规划

1、什么是动态规划:

将待解决的问题分为若干个子问题,每个子问题有公共子子问题,递归的解决每个子问题,一步一步求得总问题的答案。—— 动态规划将每个子问题只求解一次,保存在一个表格(数组)里面,而不需要每个子子问题都求解一遍,通过已知解求未知解,直到已知解的问题规模达到题目,避免许多无用工作。
(同分冶法一起理解,分冶法:将问题划分为互不相交的子问题,递归地求解子问题,然后将子问题组合起来就是原问题的解。这样一来,子问题如果有公共子问题,分冶法会做很多无用工作)
2、怎么解决动态规划的问题:
首相定义问题状态(最优解的结构特征),通常是一个动态数组;
然后找到边界;最后找到状态转移方程。
设计状态的思路:由于动态规划是将问题划分为一个个具有相同解结构的子问题,在定义状态时需要注意这一点,将子问题之间的联系定义的简单。因此,状态的定义应该是无后效性问题(已经解决的问题不受后续阶段的影响)。【相对来说的有后效性指,对子问题的描述还有不确定的地方】

经典动态规划问题定义:力扣53,求最大子序和。
建议看看weiwei大神的解析

动态规划写的很好的文章:动态规划

二、回溯

1、什么是回溯:
核心思想就是枚举每一种情况,然后进行比较,最终得到最优解。把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。
2、怎么解决回溯问题:
通常从一个位置出发对数组进行遍历,在backtrack中,如果找到一个答案就添加进去并返回;然后从下一个位置开始遍历,遍历代码结束后,需要把当前问题置为false(回溯),然后继续回溯。
回溯法与深度优先遍历的异同。

两者的不同点如下:原文链接

(1)访问的次序不同:深度优先遍历的目的是“遍历”,本质是无序的,重要的是是否被访问过,因此在实现上只需要对于每个位置是否被访问就足够了。回溯法的目的是“求解过程”,本质是有序的,也就是说必须每一步都是要求的次序。

(2)访问次数不同:深度优先遍历对已经访问过的顶点不再访问。回溯法中已经访问过的顶点可能再次访问。

(3)剪枝不同:深度优先遍历不含剪枝。

实际上,除了剪枝是回溯法的一个明显特征外(并非任何回溯法都包含剪枝部分),很难严格区分回溯法 与深度优先遍历。因为这些算法很多是递归算法,在递归调用中隐含着状态的自动回退和恢复。

写在最后:这是最初做题的理解,乱七八糟,也不准确。后面慢慢完善,并且会加入题型。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值