HDU 4832 Chess (动态规划+组合数学)

来源:互联网 发布:linux无损调整分区大小 编辑:程序博客网 时间:2024/05/30 05:21

关键点是行和列是独立的。

移动K步可以视为x方向移动i步(y向不动),y方向移动K-i步(x向不动)。分别预处理出x和y方向上移动i和K-i步时的种数,然后使用排列组合枚举i。相乘即可。

注意,计算组合数时可能使用了除法这将使模运算出错。

#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#include<map>#include<string>#include<set>#include<queue>#include<algorithm>using namespace std;typedef long long LL;const int maxn=1010;const LL mod=9999991;LL C[maxn][maxn];LL dp1[maxn][maxn],dp2[maxn][maxn];LL dp[maxn][maxn];const int mv[4]= {1,2,-1,-2};void init(){    C[0][0]=1;    for(int i=1; i<=1000; ++i)    {        C[i][0]=C[i-1][0];        for(int j=1; j<=i; ++j)        {            C[i][j]=C[i-1][j-1]+C[i-1][j];            C[i][j]%=mod;        }    }}int main(){    init();    int T,kase=0;    scanf("%d",&T);    while(T--)    {        int n,m,K,x,y;        scanf("%d%d%d%d%d",&n,&m,&K,&x,&y);        memset(dp1,0,sizeof(dp1));        memset(dp2,0,sizeof(dp2));        memset(dp,0,sizeof(dp));        dp1[0][0]=dp1[0][x]=1;        for(int i=1; i<=K; ++i)        {            for(int j=1; j<=n; ++j)            {                for(int k=0; k<4; ++k)                {                    int s=j+mv[k];                    if(1<=s&&s<=n)                        dp1[i][j]+=dp1[i-1][s];                    dp1[i][j]%=mod;                }                dp1[i][0]+=dp1[i][j];                dp1[i][0]%=mod;            }        }        dp2[0][0]=dp2[0][y]=1;        for(int i=1; i<=K; ++i)        {            for(int j=1; j<=m; ++j)            {                for(int k=0; k<4; ++k)                {                    int s=j+mv[k];                    if(1<=s&&s<=m)                        dp2[i][j]+=dp2[i-1][s];                    dp2[i][j]%=mod;                }                dp2[i][0]+=dp2[i][j];                dp2[i][0]%=mod;            }        }        LL ans=0;        for(int i=0; i<=K; ++i)        {            int j=K-i;            ans+=C[K][i]*dp1[i][0]%mod*dp2[j][0]%mod;            ans%=mod;        }        printf("Case #%d:\n%I64d\n",++kase,ans);    }    return 0;}


0 0
原创粉丝点击