http://acm.hdu.edu.cn/showproblem.php?pid=1465
对于这个题目 刚开始不知道怎么回事 找了很久也没有把规则找出来 我很纠结 但后面看了一下别人的 有觉得很简单 是一个很经典的找规则的题目哦 但你知道规则以后 就是一个水题。。。
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<iostream>
using namespace std;
int main()
{
int n;
__int64 a[21];
注意一下范围哦 a[1]=0,a[2]=1;
for(int i=3;i<21;i++)
{
int m1=i-1;
int m2=i-2;
a[i]=(a[m1]+a[m2])*(i-1);
}
while(cin>>n)
{
cout<<a[n]<<endl;
}
return 0;
}
呵呵 是不是水题啊