MYF

UVa 12034 Race

题目链接

UVa 12034

方法:动态规划

题目分析

题目大意

赛马,问n匹马到达终点的情况数量

解析

dp[i][j]表示i匹马分j次到达终点的情况数量

状态转移方程:
dp[i][j]=j*(dp[i-1][j]+dp[i-1][j-1])

j*dp[i-1][j]表示第i匹马和分j次到达的i-1匹马的情况数量

j*dp[i-1][j-1]表示第i匹马独自到达终点的情况数量,j-1堆分出了j个可插的空。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define PI acos(-1)
#define debug printf("Hi----------\n")
#define eps 1e-8
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long ll;
using namespace std;
#define maxn 1005
#define mod 10056
int dp[maxn][maxn];//dp[i][j]表示i匹马分j次到达终点的组合数
int sum[maxn]={0,1};
int main(){
dp[1][1]=1;
for (int i=2; i<=1003; i++) {
int ans=0;
for (int j=1; j<=i; j++) {
dp[i][j]=j*(dp[i-1][j]+dp[i-1][j-1])%mod;
ans=(ans+dp[i][j])%mod;
}
sum[i]=ans;
}

int t,x;
cin>>t;
for (int cas=1; cas<=t; cas++) {
cin>>x;
cout<<"Case "<<cas<<": "<<sum[x]<<endl;
}
}