递推
一、什么是递推
递推算法是一种通过已知信息逐步推导未知信息的算法设计技术。递推算法的核心思想是利用已经计算出的结果来推导新的结果,从而避免重复计算,提高效率。
二、递推算法的分类
递推算法可以分为顺推和逆推两种:
顺推法:从已知条件出发,逐步推算出要解决的问题的方法。它通常用于求解序列的下一项或达到某个特定状态所需的步骤。例如,斐波那契数列的求解就可以使用顺推法。
逆推法:从已知问题的结果出发,用迭代表达式逐步推算出问题的初始条件。它是顺推法的逆过程,通常用于求解逆向问题或回溯问题。
三、递推算法的特点
高效性:递推算法避免了数据进出栈的过程,直接从边界出发,直到求出函数值。因此,相对于递归算法,递推算法通常具有更高的效率。
简单性:递推算法将复杂的计算过程转化为简单的重复步骤,使得算法易于理解和实现。
适用性:递推算法适用于求解具有递推关系的问题,如数列、动态规划等。
四、递推算法的应用
数列求解:递推算法在求解数列问题中具有重要作用。例如,斐波那契数列、等差数列、等比数列等都可以通过递推算法来求解。
动态规划:动态规划是一种解决最优化问题的算法思想,它通常使用递推关系来求解最优解。递推算法在动态规划中具有广泛的应用。
组合数学:递推算法在组合数学中也有重要作用。例如,求解排列、组合、概率等问题时,经常需要使用递推关系来简化计算。
——————
一般来说,在步入后面的学习中,递推长与不同的算法搭配,如贪心,DP,矩阵乘法,数学内容等,在此不涉及数学内容,来锻炼一下思维
P2943
考虑如何优化
容易发现总代价不超过n,所以只要\(siz\)大于$\sqrt{n} $就不优,考虑保留从第i位起往前数有j个不同数的区间左端点,也就是分为j个线段,每个线段新出现一个数
如何动态维护呢,显然我们可以递推来做这件事,无外乎3种情况
1.此时还没有出现$\sqrt{n} $种颜色,直接添加
2.这种颜色之前没有出现过,之间顶掉一个
3.找到这种颜色在第\(pos\)段出现过,则后面几段不变,前面几段前移
T386375
递推/DP + 贪心
先不考虑未来的历史,考虑第i个字符
1.之前还没有出现过\(f_i=f_{i-1}*2+1\)
2.之前出现过,考虑算重了哪些,设此字符上一次出现的位置为\(la\),\(f_i=f_{i-1}*2-f_{la-1}\)
再考虑未来的历史
1.首先会发现f是单调递增的
2.所以贪心取上一次出现字符最靠前的字符
点击查看代码
for(int i=a.size()+1;i<=a.size()+m;i++)
{
int w=1e9,p;
for(int j=1;j<=k;j++)
if(la[j]<w) w=la[j],p=j;
if(la[p]) f[i]=2*f[i-1]-f[la[p]-1];
else f[i]=2*f[i-1]+1;
la[p]=i;f[i]=(f[i]+P)%P;
}
P4965

递推相关,作者技术不成熟时写的
浙公网安备 33010602011771号