这样想,错排n位时,先把其中一位错排,假设把一个数k放在第一位,那么有n-1种放法,然后1可以随意放置,但是有两种情况。1:1放在了第k位,也就是1和k交换了,那么剩下的直接错排有F(n-2)种方法;2:1不放在第k位,此时相当于F(n-1)(这个我没想懂)。所以递推公式就是F(n)=(n-1)*(F(n-1)+F(n-2))。
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
#include <list>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
long long int ans[22];
int main()
{
ans[2]=1;
ans[3]=2;
for(int i=4;i<=20;i++)
ans[i]=(i-1)*(ans[i-1]+ans[i-2]);
int x;
while(scanf("%d",&x)!=EOF) printf("%lld\n",ans[x]);
return 0;
}
本文探讨了错排问题的递推公式及其在编程中的应用,通过详细的数学逻辑解析,阐述了如何利用递推关系求解错排问题,并提供了一段C++代码实现,展示了递推公式的高效性和实用性。
280

被折叠的 条评论
为什么被折叠?



