【HDOJ】2048 神、上帝以及老天爷

简单递推。第n个人可与n-1个错拿的人中任意一人交换字条即可,或者假设前n-1个人有一人拿对了,但其余n-2个人均拿错了,只需要交换n-1与n即满足条件。因此,f(n) = (n-1)*f(n-1) + (n-1)*f(n-2),即f(n)=(n-1)*( f(n-1)+f(n-2) )。

#include <stdio.h>

#define MAXNUM 22

double tb[MAXNUM] = {0,0,1};

int main()
{
    int case_n, n;
    double tmp;
    int i;

    scanf("%d", &case_n);

    for (i=3; i<MAXNUM; ++i)
        tb[i] = (i-1) * (tb[i-1] + tb[i-2]);

    while (case_n--) {
        scanf("%d", &n);

        tmp = 1.0;
        for (i=1; i<=n; ++i)
                tmp *= i;

        printf("%.2lf%%\n", (tb[n]/tmp)*100.0f);
    }

    return 0;
}

 

posted on 2014-03-11 14:27  Bombe  阅读(396)  评论(0编辑  收藏  举报

导航