您的位置:首页 > 其它

UVA 12034:Race (动态规划)

2017-08-03 20:40 316 查看

Race

Time limit:1000 ms OS:Linux

点击查看题目内容

题意:

现在有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
[i])%mod;
cout<<"Case "<<ca<<": "<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM DP