标签:
分析:递推。
当N=1 和2 时,易得解,假设F(N-1)和F(N-2)已经得到,重点分析下面的情况:
当有N 封信的时候,前面N-1 封信可以有N-1 或者 N-2 封错装
前者,对于每种错装,可从N-1 封信中任意取一封和第N 封错装,故=F(N-1)*(N-1)
后者简单,只能是没装错的那封和第N 封交换信封,没装错的那封可以是前面N-1 封中的任意一个,故= F(N-2) * (N-1)。
可得,f(n)=(n-1)*(f(n-1)+f(n-2))。
数据量小可以直接打表。
1 #include<cstdio> 2 using namespace std; 3 4 int n,sum; 5 long long res[21]={0,0,1,2}; 6 7 int main() 8 { 9 for(int i=4;i<21;i++){ 10 res[i]=(i-1)*(res[i-1]+res[i-2]); 11 } 12 while(scanf("%d",&n)!=EOF) 13 { 14 printf("%lld\n",res[n]); 15 } 16 return 0; 17 }
递归表示
1 #include<cstdio> 2 #define LL long long 3 using namespace std; 4 5 int n; 6 7 LL f(int n) 8 { 9 if(n==1||n==0) return 0; 10 if(n==2) return 1; 11 if(n==3) return 2; 12 return (n-1)*(f(n-1)+f(n-2)); 13 } 14 15 int main() 16 { 17 while(~scanf("%d",&n)) 18 { 19 printf("%lld\n",f(n)); 20 } 21 return 0; 22 }
标签:
原文地址:http://www.cnblogs.com/nuc-gxg/p/5467111.html