常用递推式

常用递推式
后面问题的解可以由前面问题的解递推而来,每一项都与前面若干项有一定关联。它是一种用若干步可以重复的简单运算来描述复杂问题的方法。

爬楼梯和兔子问题和斐波那契:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) ; f ( 1 ) = 1 , f ( 2 ) = 1 f(n)=f(n-1)+f(n-2) ; f(1)=1,f(2)=1
f(n)=f(n−1)+f(n−2);f(1)=1,f(2)=1

直线分割平面:
f ( n ) = f ( n − 1 ) + n f(n)=f(n-1)+n
f(n)=f(n−1)+n

n封信,n个信封,所有信装错了信封可能情况总数(错排公式):
f ( n ) = ( n − 1 ) ( f ( n − 1 ) + f ( n − 2 ) ) ; f ( 1 ) = 0 , f ( 2 ) = 1 f(n)=(n-1)(f(n-1)+f(n-2)) ;f(1)=0,f(2)=1
f(n)=(n−1)(f(n−1)+f(n−2));f(1)=0,f(2)=1

杨辉三角:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + f [ i − 1 ] [ j ] ; ( j 不 为 1 的 时 候 ) f[i][j]=f[i-1][j-1]+f[i-1][j];(j不为1的时候)
f[i][j]=f[i−1][j−1]+f[i−1][j];(j不为1的时候)

f [ i ] [ j ] = 1 ( j 为 1 的 时 候 ) f[i][j]=1(j为1的时候)
f[i][j]=1(j为1的时候)
Catalan数
递推式奉上:h(n)= h(0) * h(n-1) + h(1) * h(n-2) + … + h(n-1)h(0) (其中n>=2)
经过错位相减的方法化简以后,是这样的:
h(n) = h(n-1) * (4n-2) / (n+1)。其中(n>1), h(0)=h(1)=1
#include
#include
long long h[35];
int main() {
h[0] = h[1] = 1;
int n;
scanf("%d", &n);
n -= 2;//为什么要减2我也不知道,减了就对了 -_-
for (int i = 2; i <= n; i++) {
h[i] = h[i - 1] * (4 * i - 2) / (i + 1);//递推
}
printf("%lld", h[n]);//注意占位符,输出
return 0;
}
第二类stirling数
#include
#include
#include
#include
using namespace std;
const int MAXN = 30;
long long a[MAXN][MAXN];
int main() {
int n, m;
scanf("%d %d", &n, &m);//n是球数,m是盒子数
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if (j == 1) a[i][j] = 1;//若只有一个盒子,就只有一种方法
else if (i == j) a[i][j] = 1;//若盒子数与球数相等,也就一种方法
else if (j == 0) a[i][j] = 0;//没盒子咋放
else if (i < j) a[i][j] = 0;//盒子比球多,咋放嘛
else if (i > j) {
a[i][j] = j * a[i - 1][j] + a[i - 1][j - 1];递推
}
}
}
printf("%lld", a[n][m]);
return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_50624971/article/details/112854141