【算法复健】递推与递归
题单-递推与递归 做题整理
P1255 数楼梯
斐波那契数列,写个大整数类直接算
P1022 [NOIP 2002 普及组] 过河卒
dp,非法点不计入即可
P1044 [NOIP 2004 普及组] 栈
设 $f[i][j] $是有 $i $个数未入栈,且 $j $个数在栈中的方案数。
初始情况是 $f[0][j]=1 $,最终目标是求 $f[n][0] $。
转移有两种情况:
入栈: $f[i][j] \leftarrow f[i-1][j+1] $
出栈: $f[i][j] \leftarrow f[i][j-1] $
P1028 [NOIP 2001 普及组] 数的计算
DFS,考虑当前数字 $x $,枚举 $1 \rightarrow \frac{x}{2} $的可能性,结束后计入总数即可
P1464 Function
为了防止大量递归浪费资源,考虑记忆化搜索
P1928 外星密码
递归,处理以下情况:
- 读到“[”:往下读一个重复数量,然后继续递归,接着复制递归得到的字符串
- 读到“]”:结束本次函数
- 无复制情况,直接拼接
P2437 蜜蜂路线
情况同第一题
P1164 小A点菜
类似 01 背包的机制,考虑 $f[i][j] $表示前 $i $个物品用 $j $元的方案数,有以下情况:
- $j = a_i: f[i][j] = f[i-1][j] + 1 $
- $j < a_i: f[i][j] = f[i-1][j] $
- $j > a_i: f[i][j] = f[i-1][j] + f[i-1][j-a_i] $
P1036 [NOIP 2002 普及组] 选数
DFS 枚举每一种可能性。
最后检测的时候直接把全部取的数加起来,判断是否为质数即可。
P3612 [USACO17JAN] Secret Cow Code S
注意题目的机制是复制最后一个字符再按照原来顺序从头复制。
那么就需要依照递归的思想,判断出对应位置的字符在原始字符串的什么位置。
我们逐步削减 $n $的大小。
假如现在 $n $处于 $S = len \times 2^k $长度的字符串中。
要将其挪到前半部分,那就让 $n - \frac{len}{2} $。
此时应当特判 $n = 0 $的情况,因为这时候说明就是复制的末尾字符。
P1259 黑白棋子的移动
观察样例的移动方式。
在前缀剩下长度 8 需要移动前,都是依照的:相邻黑白棋移到右边,最右边的两黑棋移到中间的方式。
这部分直接写个循环即可。
接着剩下的部分直接抄样例。
P1010 [NOIP 1998 普及组] 幂次方
递归,对 $n $每一个是 1 的二进制位分类讨论:
- $n = 0: 2(0) $
- $n = 1: 2 $
- $n > 1: 2(f(i)) $,如果不是最后就要加上 '+'
P1990 覆盖墙壁
考虑两种情况:
- 两行填满,记 $f[i] $是前 $i $列被填满的方案数
- 只填一行,记 $g[i] $是前 $i-1 $列被填满,第 $i $列填了一个的方案数量
那么只需要对于填两种形状的单位分类讨论,最终得到转移方程:
- $f[i] = f[i-1] + f[i-1] + 2 \times g[i-2] $
- $g[i] = f[i-1] + g[i-1] $
总之就是具体到不同情况分类。
P1498 南蛮图腾
规律还是有迹可循的。
每一个 $n $图形都是对于 $n-1 $图形复制得到的。
对于一个单位图形向右复制再向右下复制(倒过来处理)。
具体到每个字符进行复制就行了。

浙公网安备 33010602011771号