1.1递推算法
算法理解
从已知条件(通过对问题分析及化简后得出的)出发,逐步推出中间过程,进行若干步可重复性计算,逐步推出中间步骤和结果
分为以下两种:
1.顺推:从已知到问题
2.逆推:从问题到已知
\(\color{green}{关键:找出较小子问题与较大原问题之间的联系,将问题由小到大}\)
顺推:从边界出发,向问题靠拢
逆推:需要边界特判,会访问到重复的过程,需要加记忆化搜索
T1:
\(\color{green}{考虑已知和所求的差别和联系}\),已经求出来的 \(dp[i-1]\) 和 \(dp[i]\) 的区别,多了一个 \(a[i]\)
考虑新的 \(a[i]\) 与 \(dp[i]\) 的联系 于是就大致分为两种情况,不做细说
T2:
\(\color{green}{将球传递的过程其实就非常像一个递推的过程}\),于是设 \(f[i][j]\) 为传到第 i 个人花了 j 次操作的方案数,一个人球可以向两边转移,只需要从两边转移就行了
T3:(T_T)
这里的已知自然是已经求过的划分未知是当前要求的划分,我们考虑这一位如何从上一位转移过来,是多了一位还是n小了,都无法作为突破点,但是我们可以发现当这 \(f[i][j]\) 这一维一定存在每一组数字都有1是,则结果就是 \(f[i][j]\) ,考虑如何推广,若有的不为1怎么办,可以将每一位都减去1,直到有一位为1,此时的方案数在加上有1的结果就是正确答案
ps:2025.1.7补充:
对于上一位如何推导到这一位,为什么要单独考虑是否有1的情况呢?
我们考虑一共有 j 个抽屉,此时我们已经确定有一个抽屉中只放一个苹果了,那么方案数即为 j-1 个抽屉放 i-1 个苹果的方案数
然后如果没有抽屉只放一个苹果应该怎么办呢?我们先在每个抽屉放上一个苹果,然后就转化为了有 j 个抽屉放 i-j 个苹果的方案数
是不是很好理解。
本质上还是分类讨论+转化
T4:(T_T)
\(\color{green}{像这种有具体情境的题,不要去简化,如T2,T4,直接按照情景模拟设就行}\)
T5:
很水的预处理
T6:
很水的贪心
T7:(T_T)
手模后发现其实是一个斐波那契数列,递推它的1个数和长度,然后查询的时候类似于前缀和查询就可
T8:(T_T)
\(\color{green}{找好题中的两个维度是关键}\),一个是数的大小,一个是摆放位置,将一个序列转化为二维矩阵,将题中的限制转化为要求以i为边的矩阵内1的个数,求满足条件的组合个数,只需要进行一个分讨,剥出来的L形中的1的个数即可
T9:(TT_TT)
这个题的递推思想非常的明显,就是从上一个斜度转移过来,注意题面要求从外面的点跳进来再跳出去,考验细节