HDU中的递归

//Made by syx
//Time 2010年8月15日 09:01:57

//1465 不容易系列之一
//
//

总结:递推求解的基本方法:

首先,确认:能否容易的得到简单情况的解?
然后,假设:规模为N-1的情况已经得到解决。

最后,重点分析:当规模扩大到N时,如何枚举出所有的情况,并且要确保对于每一种子情况都能用已经得到的数据解决。
强调:
1、编程中的空间换时间的思想
2、并不一定只是从N-1到N的分析

//1465 不容易系列之一

//基本形式:d[1]=0;   d[2]=1
//递归式:d[n]= (n-1)*( d[n-1] + d[n-2])
//这就是著名的错排公式

1、当N=1和2时,易得解~,假设F(N-1)和F(N-2)已经得到,重点分析下面的情况:
2、当有N封信的时候,前面N-1封信可以有N-1或者 N-2封错装
3、前者,对于每种错装,可从N-1封信中任意取一封和第N封错装,故=F(N-1)*(N-1)
4、后者简单,只能是没装错的那封和第N封交换信封,没装错的那封可以是前面N-1封中的任意一个,故= F(N-2) * (N-1)

#include <stdio.h>
int main()
{
__int64 a[21] = {0,0,1};
int i , n;
for(i=3; i<21; i++)
{
a[i] = (i-1) * (a[i-1] + a[i-2]);
}
while(scanf("%d",&n) != EOF)
{
printf("%I64d\n",a[n]);
}
return 0;
}



posted @ 2010-08-15 09:58  BuildNewApp  阅读(457)  评论(0编辑  收藏  举报