递推学习笔记

递推其实就是根据已有的条件推出答案,比较经典的递推有斐波那契数列。

我们设F(n)为数列第n个数。
F(x)=F(x1)+F(x2)
其中边界条件为F(1)=1 F(2)=1

这就是一种递推操作。另外的比较著名的递推还有:汉诺塔、Catalan数......但这些题目都不算dp,动态规划比这些要复杂多了。

然后递推和递归也有很大的关系,刚开始大家都会先写递归(递归好写一些),而递推的话会更好,还会防止爆栈问题。

现在我们根据一道例题来深入理解递推操作:

求多少个n个数的排列A ,满足对于任意的i(1in) 使Aii
我们考虑递推
首先容易推出来f(1)=0因为一个数的全排列只有一个,不可能错排
然后f(2)=1 两数相反就可以

3开始推,我们先考虑n个数分别放在n个位置有n种方法,不放在原位置就是n1种方法

然后看两种情况
1.数x放在原位置上,那那么除l外的n1个数的方法就有f(n2)种方案(其他数字放在不同的位置)
2.数x不放在原位置上,那其他数就乱放,方案数为f(n1)

所以递推式为
f(n)=(n1)(f(n1)+f(n2))(n>2)
代码

#include <iostream> #include <cstring> #include <algorithm> using namespace std; unsigned long long a[25]; int main() { int n; cin >> n; a[1] = 0; a[2] = 1; for (int i = 3; i <= n; i ++ ) a[i] = (i - 1)*(a[i - 1] + a[i - 2]); cout << a[n]; return 0; }

__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/16479397.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(46)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示