记忆化搜索思想浅谈

记忆化搜索

第一步:搞清递归

递归函数的执行流程分为两个阶段:递归前进段、递归返回段。

这可以说一个很神奇的东西。总的来说就是:递归前进段就是你按它函数的顺序执行下去,直到碰到边界;递归返回段就是当你碰到了边界,你把刚刚所有递归嵌套的函数值算出来,一步一步返回值,返回给最初的值。

这里有一个我很容易搞错的东西,也很难理解的东西:每递归调用一次函数,系统就会生成一个新的函数实例。这些函数实例有同名的参数和局部变量,但各自独立,互不干扰。流程执行到哪一层,那一层的变量就起作用,返回上一层,就释放掉低层的同名变量。这个需要深刻理解一下。

递归构建有三个条件:1)参数;2)边界;3)范围。

据此来分析递归过程如何写。

1 参数:明确参数的意义以及当前的值;

2 边界:一个递归函数一定要有边界,而且边界一定要考虑全面,不能漏,否则它就可能死循环;

3 范围:就是你在递归时的选择往哪儿走,也就是说,你的递归调用的函数返回值。

记忆化搜索:

① 定义好一个数组,用来存储递归所求出来的值;②在主程序里,memset一下,一般都是赋初值为-1,然后把这个数组的边界值设置好;③在递归函数里,首先加一句:if (这个数组的值>=0) return 这个值【如果赋初值为-1的话,一般都是>=0】;其次,在后面的递归调用中,先给这个数组赋值,再return

 

NOIP2018 rp++
原文地址:https://www.cnblogs.com/brilliant107/p/9471222.html