zoukankan      html  css  js  c++  java
  • UVa 12034 Race (递推+组合数学)

    题意:A,B两个人比赛,名次有三种情况(并列第一,AB,BA)。输入n,求n个人比赛时最后名次的可能数。

    析:本来以为是数学题,排列组合,后来怎么想也不对。原来这是一个递推。。。

    设n个人时答案为f(n)假设第一名有i(0< i <= n)个人,也就是有C(n, i)种,还剩下f(n-i)种可能,然后就so easy了。

    f(n) = ΣC(n, i)f(n-i)。

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define mod %10056
    
    using namespace std;
    const int maxn = 1001;
    int c[maxn+5][maxn+5], f[maxn+5];
    
    void init(){
        for(int i = 0; i < maxn; i++)
            c[i][i] = 1, c[i][0] = 1;
        for(int i = 1; i < 1001; i++)
            for(int j = 1; j <= i; j++)
                c[i][j] = (c[i-1][j-1] + c[i-1][j]) mod;
    
    }
    
    void solve(){
        f[0] = 1, f[1] = 1, f[2] = 3;
        for(int i = 3; i < 1001; i++)
            for(int j = 1; j <= i; j++){
                int k = (c[i][j]*f[i-j]) mod;
                f[i] = (k+f[i]) mod;
            }
    }
    
    int main(){
        memset(c, 0, sizeof(c));
        memset(f, 0, sizeof(f));
        init();
        solve();
        int n, T, cases = 0;   cin >> T;
        while(T--){
            scanf("%d", &n);
            printf("Case %d: %d
    ", ++cases, f[n]);
        }
        return 0;
    }
    
  • 相关阅读:
    03 类与对象
    课堂作业02程序设计
    动手动脑
    做课题时的一些问题
    课题一
    《大道至简》JAVA伪代码读后感
    题目-兔子繁衍问题
    题目-求一个日期是该年中的第几天
    题目-查验身份证
    题目-删除重复字符
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5537159.html
Copyright © 2011-2022 走看看