UVA 12034:Race (动态规划)

来源:互联网 发布:怎么买特价机票知乎 编辑:程序博客网 时间:2024/05/16 05:47

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=23匹马的情况: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[i1][j1]j+dp[i1][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;}
原创粉丝点击