UVA 12034 - Race(简单DP)

题目链接 https://cn.vjudge.net/problem/UVA-12034

【题意】
A,B两个人赛马,最终的名次有3种可能:并列第一,A第一B第二,B第一A第二. 输入n(1<=n<=1000)求n个人赛马时最终名次的个数,对10056取模

【思路】
设答案为dp[n],假设并列第一名有 i 个人,有 Cni 种可能性,接下来有dp[ni]种可能性,因此答案为i=1nCnidp[ni]

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=1005;
const int mod=10056;

int c[maxn][maxn];
int dp[maxn];

void solve(){
    c[0][0]=1;
    for(int i=1;i<maxn;++i){
        c[i][0]=1;
        for(int j=1;j<=i;++j) c[i][j]=(c[i][j]+c[i-1][j]+c[i-1][j-1])%mod;
    }
    dp[0]=dp[1]=1;
    for(int i=2;i<maxn;++i){
        for(int j=1;j<=i;++j) dp[i]=(dp[i]+c[i][j]*dp[i-j])%mod;
    }
}

int main(){
    solve();
    int T;
    scanf("%d",&T);
    for(int kase=1;kase<=T;++kase){
        int n;
        scanf("%d",&n);
        printf("Case %d: %d\n",kase,dp[n]);
    }
    return 0;
}
posted @ 2018-08-23 17:23  不想吃WA的咸鱼  阅读(143)  评论(0编辑  收藏  举报