hdu2048递归问题

题目思路:

其实我还真没怎么看出来这个是递推(嘤嘤自己好菜哇)……不过很清楚的是我们需要求出每个人拿到的都不是自己的牌子的情况有几种,按照日常经验,如果前n个人已经做到了错排(也就是拿的都不是自己的牌子),当第n+1个人来的时候,他跟任意一个人交换后就能做到这n+1个人都实现错排,!!但是注意还有一种情况,就是前n个人并没有实现完全错排,有一个人拿的牌子是正确的,这时第n+1个人来了之后,他只要跟这个拿对了牌子的人交换也可以做到n+1个人错排,这时可以看作是n-2个人实现了错排;

所以综上,递推式就可以出来了:

f [ i ] = ( f [ i - 2 ] + f [ i - 1 ] ) * ( i - 1 ) ;
————————————————

参考链接:https://blog.csdn.net/destiny1507/article/details/81229565

 

import java.text.DecimalFormat;
import java.util.Scanner;

public class hdu2048 {
    public static long jc(int xx) {
        long yy = 1;
        if (xx==0) {
            return 1;
        }
        for (int i = 1; i <= xx; i++) {
            yy *= i;
        }
        return yy;
    }
    
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        long[] aa = new long[21];
        aa[1] = 0;
        aa[2] = 1;
        DecimalFormat df = new DecimalFormat("#.00");
        for (int i = 3; i < aa.length; i++) {
            aa[i] =(i-1)*(aa[i-1]+aa[i-2]);
        }
        
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            int x = sc.nextInt();
            System.out.println(df.format(aa[x]*100.0/jc(x))+"%");
        }
        sc.close();
    }

}

 

posted @ 2024-05-12 12:26  XiaohuangTX  阅读(1)  评论(0编辑  收藏  举报