专题三总结
2016-05-31 20:59
232 查看
这个专题讲的是动态规划的内容,到现在为止,已经做了3个专题了,我个人认为,动态规划这个专题还是挺好做的,没有刚开始老师说的的那么难。
先来点理论知识吧。所谓动态规划,它是解决多阶段决策问题的一种方法。动态规划的指导思想就是在做每一步决策时,列出各种可能的局部解,依据某种判定条件,舍弃那些肯定不能得到最优解的局部解。以每一步都是最优的来保证全局是最优的。以我个人的观点来看,我觉得折合贪心算法差不多,只不过我觉得动态规划比贪心更严谨罢了,贪心也是在每一步求最优解然后组成整体的最优解,只是它不严谨,并不能保证最后的答案一定是最优的。
动态规划的基本模型
动态规划问题具有以下基本特征:
问题具有多阶段决策的特征。
每一阶段都有相应的“状态”与之对应,描述状态的量称为“状态变量”。
每一阶段都面临一个决策,选择不同的决策将会导致下一阶段不同的状态。
每一阶段的最优解问题可以递归地归结为下一阶段各个可能状态的最优解问题,各子问题与原问题具有完全相同的结构。
动态规划的一般解题步骤
1、判断问题是否具有最优子结构性质,若不具备则不能用动态规划。
2、把问题分成若干个子问题(分阶段)。
3、建立状态转移方程(递推公式)。
4、找出边界条件。
5、将已知边界值带入方程。
6、递推求解。
以上的都是课件上的一些理论知识,接下来的才是我自己通过亲身做动态规划的题目的一些感悟。
动态规划在求解问题的过程中,也是分步来进行的,列出每一步所有的可能的解,然后依据某种规则,题目中的要求去挑选出一种最合理的解(最优解),以我个人的观点来看,我觉得和贪心算法差不多,只不过我觉得动态规划比贪心更严谨罢了,贪心也是在每一步求最优解然后组成整体的最优解,只是它不严谨,一些题目用贪心并不能保证最后的答案一定是最优的。
在动态规划这个专题中,我觉得要想做好题目,最重要的是要找到每个题目的状态转移方程,当然这是思想的方面,至于技术方面,我觉得一定要熟练掌握递归,这个是写这些题目的根本,而且,我觉得动态规划和数学的联系很密切,像一些数学方面的递推公式在这方面都可以得到应用,我记得这个专题里面就有好几道这样的题目,对于像这样的类似的题目,只要我们找到其中的公式,代码就非常简单了,有的就只有几行,可以说就是事半功倍了。然后,这个专题中,涉及到一些背包问题,像01背包,完全背包还有分组背包,对于这3种问题,我觉得最难的不是代码,二是我们遇到问题的时候能否想起来用它这才是最根本的,特别是分组背包,很难在实际做题的时候想到去用它,这三种背包问题的状态转移方程都已经总结好了,这里就不再特别说明了,我们还是要好好想想这3中问题的应用场景,实际问题中好好想想应该用哪一种。还有个经典的是求最长自序列问题,这类题目用递推,一个字符一个字符的比较,直到递推结束,还有,要了解自序列和子串的区别,不要混淆了。
差不多就是这些了,想到什么再补充吧。
先来点理论知识吧。所谓动态规划,它是解决多阶段决策问题的一种方法。动态规划的指导思想就是在做每一步决策时,列出各种可能的局部解,依据某种判定条件,舍弃那些肯定不能得到最优解的局部解。以每一步都是最优的来保证全局是最优的。以我个人的观点来看,我觉得折合贪心算法差不多,只不过我觉得动态规划比贪心更严谨罢了,贪心也是在每一步求最优解然后组成整体的最优解,只是它不严谨,并不能保证最后的答案一定是最优的。
动态规划的基本模型
动态规划问题具有以下基本特征:
问题具有多阶段决策的特征。
每一阶段都有相应的“状态”与之对应,描述状态的量称为“状态变量”。
每一阶段都面临一个决策,选择不同的决策将会导致下一阶段不同的状态。
每一阶段的最优解问题可以递归地归结为下一阶段各个可能状态的最优解问题,各子问题与原问题具有完全相同的结构。
动态规划的一般解题步骤
1、判断问题是否具有最优子结构性质,若不具备则不能用动态规划。
2、把问题分成若干个子问题(分阶段)。
3、建立状态转移方程(递推公式)。
4、找出边界条件。
5、将已知边界值带入方程。
6、递推求解。
以上的都是课件上的一些理论知识,接下来的才是我自己通过亲身做动态规划的题目的一些感悟。
动态规划在求解问题的过程中,也是分步来进行的,列出每一步所有的可能的解,然后依据某种规则,题目中的要求去挑选出一种最合理的解(最优解),以我个人的观点来看,我觉得和贪心算法差不多,只不过我觉得动态规划比贪心更严谨罢了,贪心也是在每一步求最优解然后组成整体的最优解,只是它不严谨,一些题目用贪心并不能保证最后的答案一定是最优的。
在动态规划这个专题中,我觉得要想做好题目,最重要的是要找到每个题目的状态转移方程,当然这是思想的方面,至于技术方面,我觉得一定要熟练掌握递归,这个是写这些题目的根本,而且,我觉得动态规划和数学的联系很密切,像一些数学方面的递推公式在这方面都可以得到应用,我记得这个专题里面就有好几道这样的题目,对于像这样的类似的题目,只要我们找到其中的公式,代码就非常简单了,有的就只有几行,可以说就是事半功倍了。然后,这个专题中,涉及到一些背包问题,像01背包,完全背包还有分组背包,对于这3种问题,我觉得最难的不是代码,二是我们遇到问题的时候能否想起来用它这才是最根本的,特别是分组背包,很难在实际做题的时候想到去用它,这三种背包问题的状态转移方程都已经总结好了,这里就不再特别说明了,我们还是要好好想想这3中问题的应用场景,实际问题中好好想想应该用哪一种。还有个经典的是求最长自序列问题,这类题目用递推,一个字符一个字符的比较,直到递推结束,还有,要了解自序列和子串的区别,不要混淆了。
差不多就是这些了,想到什么再补充吧。
相关文章推荐
- 我们需要什么样的测试项目负责人
- Linux源码包软件的安装与卸载
- 在centos中安装了mysql5.7之后解决不知道随机的密码的问题
- (版本定制)第15课:Spark Streaming源码解读之No Receivers彻底思考
- 《Spring实战》-1
- LINK : fatal error LNK1104: cannot open file 'LIBCD.lib' 解决办法
- 由SplashActivity界面跳转到主界面的方法
- MySQL 高效分页
- SQL表连接查询(inner join、full join、left join、right join)
- Fragment的回退(Fragment入栈与出栈以及实物提交返回id)
- jqueryUI 之dialog 使用
- 其实差的就是熟练使用锄头和铁锹
- eclipse 编码助手 之 代码自动提示
- Permutations II
- JAVA对象创建代码调用顺序
- opencv与opengl混用实现三维点云图像
- spark-submit java.lang.OutOfMemoryError: Java heap space
- Linux 网络配置
- Android__Broadcast
- HBase 配置教程