题目描述:
* 假设有n封信要装入到n个信封中,每封信应该要放到对应的信封中:
* 信: A,B,C,D...
* 信封: a,b,c,d...
* 由于疏忽将信放置出错,总共有多少种可能性每封信都放错。
*
* 假设:D(n)表示n封信总共装错的总数
* 如果将A装到B的信封里去:
* -将B装到A信封里去:A->b,B->A 出错的总数:取决于剩下的n-2封信:D(n-2)
* -将B装到除A以外的其他信封中:剩余n-1封信放错的可能性为: D(n-1)
* 所以在这种情况下,总共的错误为:D(n-1)+D(n-2)
* 如果将A装到C,D,E (n-2)*(D(n-1)+D(n-2));
* 总的出错总数:(n-1)*(D(n-1)+D(n-2));
*
* 如果是0封信:D(0)=0;
* 如果是1封信:D(1)=0;
* 如果是2封信:D(2)=1;
* 如果是3封信:D(3)=(3-1)*(D(3-1)+(3-2))=2*(1+0)=2;
* 以此类推...
代码实现:
import java.util.*;
public class WrongRow {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
int num=sc.nextInt();
System.out.println(Num(num));
}
}
public static long Num(int num){
long[] dp=new long[num+1];
if (num==1||num==0){
dp[0]=0;
dp[1]=0;
}
if (num==2){
dp[2]=1;
}
for (int i = 3; i <=num ; i++) {
dp[2]=1;
dp[i]=(i-1)*(dp[i-1]+dp[i-2]);
}
return dp[num];
}
}