递推
斐波那契类
当前项是前两项元素之和,我们可以使用数组存储中间结果,则 同时递推的边界条件为 ,目标解即为
同时,为了节省空间,我们可以迭代的来求解:
cppa = 1;
b = 1;
for (int i = 3; i <= n; i++) {
t = a + b;
a = b;
b = t;
}
cout << b << endl;
通过上面的分析,我们可以看出:递推需要找出前后项之间的关系,确立一个关系式,借助循环语句求解答案。
因此,递推的关键是确定两件事:
- 递推关系式
- 递推边界
递推有两种思考方向:
- 顺推
- 逆推
经典例题:洛谷 P1255. 数楼梯
级台阶,每次可以走 级或者 级,求不同走法的方案数。
问题分析:当 时的方案数是多少?斐波那契数列。 也可以这样理解,当楼梯级数是 的方案数是楼梯级数是 时走 级到达第 级的方案数加上楼梯级数是 时走 级到达第 级的方案数之和。
经典例题:兔子繁殖问题
雌雄兔子各一只放入养殖场中,每只雌兔在出生两个月后每月产雌雄兔子个一只。第 个月后养殖场共有多少对兔子?
问题分析:当 时答案是多少?斐波那契数列。
汉诺塔类
经典例题:求汉诺塔问题中盘子总共移动了多少次?
问题分析:设 表示讲 个盘子从一个柱子移动到另一个柱子所需要的移动次数。借助递推的思想,可以先整体考虑移动 柱上面的 个盘子到 柱,移动次数为 ,接着将 柱上的第 个盘子移动到 柱上,移动次数为 ,最后将 柱上的 个盘子移动到 柱上,移动次数为 ,因此:,边界条件:。
经典例题:Jouier 2410. Strange Towers of Hanoi
问题分析:设 表示求解 盘 塔问题的最少步数, 表示求解 盘 塔问题的最少步数。,边界条件:。上式的含义是:先把 个盘子在 塔模式下移动到 柱,然后把 个盘子在 塔模式下移动到 柱,最后把 个盘子在 塔模式下移动到 柱。考虑所有可能的 ,取最小值即可。
平面分割类
经典例题:设有 条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。

问题分析:当平面上已经有 条曲线将平面分割成 个区域后,画第 条曲线时,第 条曲线与之前 条曲线每个曲线都会相交,与每个曲线相交会多产生 个区域,共多出来 个区域。,边界条件:
双递推类
经典例题:位数问题
在所有的 位数中,有多少个数中有偶数个数字 ?请输出答案对 取余之后的值。
问题分析:设 表示前 位取偶数个 有几种情况, 表示前 位取奇数个 有几种情况。
- 边界条件:
矩阵递推
经典例题:YBT 1258:数字金字塔
问题分析:设 表示从 到 的最大路径之和,
边界:
目标解:
以上递推方式为顺推,如何进行逆推呢?请同学们思考!
习题
- 洛谷 P1002. 过河卒
- 洛谷 P1044. 栈
- 洛谷 P1011. 车站
- 洛谷 P2437. 蜜蜂路线
- 洛谷 P1164. 小 A 买菜