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;
}
作者:BuildNewApp
出处:http://syxchina.cnblogs.com、 BuildNewApp.com
本文版权归作者、博客园和百度空间共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则作者会诅咒你的。
如果您阅读了我的文章并觉得有价值请点击此处,谢谢您的肯定1。