词条 | 记忆化搜索 |
释义 | 记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。 一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。 更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。 记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来, 以后再次遇到这个状态的时候,就不必重新求解了。 这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。 上传/更换附件动态规划的另一种实现形式——记忆化搜索的应用 题目描述:已知n个slots,1<n<17,每个slot有一个height,height的值有四种,分别为{1,2,3,4}.给你n个slot的,必须满足以下两个条件,求有多少种情况. 一:必须有两个相邻的slot的差为3,即一个为4,一个为1. 二:必须有三种不同的height值. Sample Input 2 3 -1 Sample Output 2: 0 3: 8 这道题有组合公式,但想推出来不容易,其实用搜索就能很好地解决。 如果用暴搜的话,当n>10就会超时。这时,很容易想到动态规划,但DP不仅需要推出状态转移方程式,还要进行拓扑排序,对于这题,很难用传统的DP解决。 虽然不能使用传统意义上的动态规划解决本题,但动态规划的思想仍然能起到作用。搜索相对于动态规划最大的劣势无非就是重复计算子结构,所以我们在搜索的过程中,对于每一个子结构只计算一次,之后保存到数组里,以后要用到的时候直接调用就可以了,这就是我要介绍的记忆化搜索。 记忆化搜索的实质是动态规划,效率也和动态规划接近,形式是搜索,简单直观,代码也容易编写,不需要进行什么拓扑排序了。 可以归纳为:记忆化搜索=搜索的形式+动态规划的思想 对于状态的存储,可用数组num[a] [c][d],其中a为还剩几个,b为找到了哪几个,c为找到的最后一个数,d表示是否已经出现1,4相连的两数。 这样不需要任何其他的优化,程序就能0ms得到AC. |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。