链接: https://vjudge.net/problem/UVA-12034
题意:A,B两个人赛马,最终名次有3种可能:并列第一;A第一,B第二;B第一A第二
现在n个人赛马,问最终名次的可能情况的个数对10056取模
分析:设答案为f(n),假设第一名有i个人,有C(n,i)种可能性,接下来有f(n-i)种可能性,答案为所有的i(1<=i<=n) C(n,i)*f(n-i)
f(0)=1
可以列出前几项, n=1 f(1)=f(0)
n=2 C(2,1)*f(1)+C(2,2)*f(0)
n=3 C(3,1)*f(2)+C(3,2)*f(1)+C(3,3)*f(0)
…… 依次类推
这里用状态转移方程: dp[i][j]=dp[i-1][j]+dp[i-1][j] 来表示组合数公式,结合上述递推公式,打表记录
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=10056;
const int N=1e3+5;
typedef long long LL;
#define mem(a,n) memset(a,n,sizeof(a))
int dp[N][N],ans[N];
void init()
{
dp[0][0]=1;
for(int i=1;i<N;i++)
{
int sum=0;
for(int j=1;j<=i;j++)
{
dp[i][j]=(dp[i-1][j]+dp[i-1][j-1])%mod*j%mod;
sum=(sum+dp[i][j])%mod;
}
ans[i]=sum;
}
}
int main()
{
init();
int T,cas=1;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
printf("Case %d: %d\n",cas++,ans[n]);
}
return 0;
}