Race
题意:
现在有n匹马,要求安排出场顺序,可以有多匹马同时出场,问一共有多少种方式。
解题思路:
设一共i匹马时,出场次序数量为 j 时的出场方式为 a[i][j]
1匹马的情况:a[1][1]=1 没啥好说的
2匹马的情况:a[2][1]=1 , 对于a[2][2] 只能在a[1][1]的基础上把第二匹马放到前面或后面,
所以a[2][2]=a[1][1]*2=2
3匹马的情况:a[3][1]=1 , 对于 a[3][2],就可以在a[2][1]的基础上前后加一条,也可在a[2][2]的基础上任选和其中一匹马同时跑,由此
a[3][2]=a[2][1]*2+a[2][2]*2
图虽然画的比较难看。。还是看图吧
总之由上面的规律就能得出状态转移方程
dp[i][j]=dp[i−1][j−1]∗j+dp[i−1][j]∗j
Code:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1005;
const int mod=10056;
int dp[maxn][maxn];
int main()
{
mem(dp,0);
for(int i=1;i<=1000;i++)
{
for(int j=1;j<=i;j++)
{
if(j==1)
dp[i][j]=1;
else
dp[i][j]=(dp[i-1][j-1]*j+dp[i-1][j]*j)%mod;
}
}
int T;
cin>>T;
for(int ca=1;ca<=T;ca++)
{
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
sum=(sum+dp[n][i])%mod;
cout<<"Case "<<ca<<": "<<sum<<endl;
}
return 0;
}