Loading

递推

一、什么是递推

递推算法是一种通过已知信息逐步推导未知信息的算法设计技术。递推算法的核心思想是利用已经计算出的结果来推导新的结果,从而避免重复计算,提高效率。

二、递推算法的分类

递推算法可以分为顺推和逆推两种:
顺推法:从已知条件出发,逐步推算出要解决的问题的方法。它通常用于求解序列的下一项或达到某个特定状态所需的步骤。例如,斐波那契数列的求解就可以使用顺推法。

逆推法:从已知问题的结果出发,用迭代表达式逐步推算出问题的初始条件。它是顺推法的逆过程,通常用于求解逆向问题或回溯问题。

三、递推算法的特点

高效性:递推算法避免了数据进出栈的过程,直接从边界出发,直到求出函数值。因此,相对于递归算法,递推算法通常具有更高的效率。

简单性:递推算法将复杂的计算过程转化为简单的重复步骤,使得算法易于理解和实现。

适用性:递推算法适用于求解具有递推关系的问题,如数列、动态规划等。

四、递推算法的应用

数列求解:递推算法在求解数列问题中具有重要作用。例如,斐波那契数列、等差数列、等比数列等都可以通过递推算法来求解。

动态规划:动态规划是一种解决最优化问题的算法思想,它通常使用递推关系来求解最优解。递推算法在动态规划中具有广泛的应用。

组合数学:递推算法在组合数学中也有重要作用。例如,求解排列、组合、概率等问题时,经常需要使用递推关系来简化计算。

——————
一般来说,在步入后面的学习中,递推长与不同的算法搭配,如贪心,DP,矩阵乘法,数学内容等,在此不涉及数学内容,来锻炼一下思维

P2943

fi=minj=1i1fj+siz2

考虑如何优化

容易发现总代价不超过n,所以只要\(siz\)大于$\sqrt{n} $就不优,考虑保留从第i位起往前数有j个不同数的区间端点,也就是分为j个线段,每个线段新出现一个数

如何动态维护呢,显然我们可以递推来做这件事,无外乎3种情况
1.此时还没有出现$\sqrt{n} $种颜色,直接添加

2.这种颜色之前没有出现过,之间顶掉一个

3.找到这种颜色在第\(pos\)段出现过,则后面几段不变,前面几段前移

fi=minj=1nfpj1+siz2

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

posted @ 2024-12-12 20:52  Mortis_Life  阅读(231)  评论(0)    收藏  举报