一.dp
动态规划的本质
是一种思想。通过对原问题划分成子问题,寻找子问题之间的联系,通过求解子问题得出原问题的解。与贪心不同的是,动归是深谋远虑,考虑全局最优解;而贪心则目光短浅,只考虑局部最优解。
子问题 对应 状态
子问题之间的联系 对应 状态转移
边界子问题 对应 边界状态(状态转移的边界)
边界子问题:其结果不依赖其他子问题
求解动态规划类题目的要点
定义状态
寻找状态转移方程
边界状态
值得一提的是 动态规划中边界状态是可以由状态定义轻松得出 边界不能忽略。
动态规划的分类
按照常用套路的不同,可以对动态规划进行如下分类:
一维动规
背包动规
区间动规
树形动规
DAG动规
二.搜索
搜索的重点
搜索的实现
剪枝与优化
盲目搜索与启发式搜索
盲目搜索(只是搜索的顺序不同):
深度优先搜索 宽度优先搜索
启发式搜索:
A*算法
dfs
问题
1.深度问题
2.死循环问题
解决方法
1.对深度加以限制
2.记录从初始状态到当前状态的路径
深度优先搜索的性质
一般不能保证找到最优解 当深度限制不合理时,可能找不到解,可以将算法改为可变深度限制
最坏情况时,搜索空间等同于穷举
是一个通用的与问题无关的方法
节省内存,只存储从初始节点到当前节点的路径
bfs
优先扩展深度浅的节点 通常使用一个队列来实现
广度优先搜索的性质
当问题有解时,一定能找到解
当问题为单位耗散值,且问题有解时,一定能找到最优解
方法与问题无关,
效率较低
存储量比较大
迭代加深搜索
解决宽搜内存消耗大和深搜不能保证最优解的问题
分析:
宽搜内存消耗大是由于记录了搜索扩展的节点
深搜不能保证最优解是由于其扩展不是按照代价的顺序扩展的
所以我们需要:
不记录所有扩展节点
按照顺序扩展
解决办法:
枚举最大的代价,用深搜判断是否有解
启发式搜索
在OI中常常也被称为A*搜索
关键在于对当前局面作出预估,判断当前局面到目的局面至少还需要多少步
估价函数:估价函数的好坏决定了A*算法的优劣