本周看了stl:六篇,深度优化搜索:四篇,广度优先搜索:两篇,类:八篇,记忆搜索:七篇,指针:三篇,动态规划:十六篇,做了9道题做出3道
回顾了前段时间学的搜索发现不管是什么类型的搜索题例如:寻找最短路径,最值(广度优先搜索)输出所有路线,总共多少路线(深度优化搜索),解决此类型的题目的方法比较单一。
对于广度优先搜索是用队列queue将每个已经搜索的位置进行标注,防止对一位置多次搜索,然后将从该位置可以往下进行的路线压入队列并进行标注,当满足时输出,由于每个位置要进行的下一步都被压入队列,每条路线,次数,在队列中被拿出进行运算的一定为最短举例。 其大体模板是将首位置加压入队列,该位置可以往下进行的路线标记压入队列,将压入队列首位置删除,以此往复。
深度优化搜素利用的是递归函数将满足条件的路线或者位置一直往下直至问题解决或者违反条件退出,此递归每个位置可能会被查询多次,时间复杂度比较高,但可以将所有的解决方案,或者次数输出。其大体模板为,建立一个递归函数,应题目要求,记录次数,或者输出路线。在递归函数中规划好题目中的限制和结束时的条件。
动态规划:如果一个问题可以将其拆分为多个子问题并且其在后面的拆分中下一的子问题可以反馈给上一级子问题帮助其解决(问题之间存在的递推关系,或者可以相互转化),这样可以逐渐的将问题范围变小,逐渐的去解决一个个子问题,最后反馈出主问题的解决方式。在运算时将每个解决后的子问题保存记录下来方便于后面直接引用,也就是说每个元素或者问题只需要走一次大大的节省了时间。但是动态规划更不同于深度,广度搜索,并没有模板,所以在解决问题的时候需要自己去判断是否要进行动态规划,这个动态规划需要怎么去设计自主问题的递推关系,在过程中怎么去运算子问题并将其保存。
本周学习DP大部分的东西无法理解,但是由于动态规划需要保存每个子问题的解决答案,所以我从记忆化搜索入手
记忆化搜索类似于深度优化搜索,但不同的是不需要每次调用下一级时重新计算,而是先将所以下一级的问题答案进行保留,然后再后续直接引用,大大减少了运算时间。大体模板就是在原来递归函数的基础上加一个段代码保存每个阶段函数的值:比如dd(int x,int y)在运算时加if(dd(i,j)满足某一条件)return dd(i,j);