DP入门篇
来源:互联网 发布:薛之谦淘宝店dangerous 编辑:程序博客网 时间:2024/05/14 15:04
DP(Dynamic Programming)中文即称动态规划,据说是在造原子弹的时候发明出来的(陈计说的,本人对此不表示负责- -!)。
DP最主要的动机是存储中间状态,减少甚至避免重复计算。
主要实现方法:
1.数组递推
适用于状态顺序明确,层次清晰的模型,用几个for循环即可实现。
2.记忆化搜索(备忘录)
相对于上一种中如果递推顺序不明显的话可以用记忆化搜索,即用一个全局变量数组,保存搜索过程中计算到的值,下一次再搜索到这个状态的时候可以直接返回结果。
一般解题步骤:
1.设计状态
设计状态必须满足两个特性:
1.最优子结构
局部最优能导致全局最优。
2.无后效性
这个最优解一旦确定就不会改变,就后面出现的状态不会使该状态更优,就后面出现的状态不会影响到前面的状态,最直观的意思就是层次分明,有阶段性。
2.设计状态转移方程
当状态转移方程写不出来的时候就又要回过头去看状态设计有没有问题,一般解决方法是增加状态的维数,参见院赛(恶魔猎手的冒险)。
3.优化时间空间等
当时间空间要求较高的时候就要进行优化了。
时间优化:
1.用高级数据结构协助(如线段树等)
2.降低状态维度
3.根据单调性,如四边形不等式优化,单调队列优化等
4.看是否有贪心性质,对某个转移是否可以直接贪心得到
空间优化:
1.滚动数组(第n层状态只跟前一层状态有关,前n-2层状态都没必要保存)
常见模型:
1.背包(参见背包9讲)
1.1 01背包(参见院赛第一题)
1.2 无限背包
1.3 多重背包等等
2.最长不下降子序列
O(n^2) O(nlogn) 两种,其中O(nlogn)就利用了单调性,额外维护一个数组并二分查找
3.最长公共子序列
最后推荐一个网址:http://www.isuanfa.cn/thread.php?fid=15
- DP入门篇
- DP入门篇
- DP入门篇
- DP入门
- DP入门
- DP入门
- dp入门
- DP入门
- DP入门
- DP入门
- dp入门
- DP入门
- DP入门
- 状态压缩DP 入门
- 树形DP 入门
- 树形DP入门
- 状态压缩DP入门
- 插头DP【入门】
- C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- list unique使用
- Linux下多进程与多线程
- 2010年 PHP安装笔记
- PHP文件上传的原理及实现
- DP入门篇
- 2010年技术文章 Apache生成密码文件
- 一周两面,亲历华为群P
- ubuntu下安装和使用php的fileinfo扩展
- rabbitmq
- 讨论: TDD in HTML & JavaScript 之可行性和最佳实践
- 走火入魔.NET权限组件-用树型资源权限(数据集权限)思想来权限递归问题
- 第一篇博客
- 走火入魔.NET权限组件-用资源权限(设置权限)思想来解来解决权限的存储问题