码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1801 中国象棋

时间:2016-11-03 02:10:43      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:ret   bzoj   print   scan   color   状态   namespace   bsp   中国   

终于大概会推dp方程了。。。然而怎么定义状态是个麻烦的事情。

很多时候感觉想不到。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mod 9999973
using namespace std;
long long n,m,dp[105][105][105];
long long calc(long long x) {return (x*(x-1)/2)%mod;}
int main()
{
    scanf("%lld%lld",&n,&m);
    dp[0][0][0]=1;
    for (long long i=1;i<=n;i++)
        for (long long j=0;j<=m;j++)
            for (long long k=0;k<=m-j;k++)
            {
                dp[i][j][k]+=dp[i-1][j][k];dp[i][j][k]%=mod;
                if (j) dp[i][j][k]+=dp[i-1][j-1][k]*(m-j-k+1)%mod;dp[i][j][k]%=mod;
                if ((k) && (j<=m-1)) dp[i][j][k]+=dp[i-1][j+1][k-1]*(j+1)%mod;dp[i][j][k]%=mod;
                if (j>=2) dp[i][j][k]+=dp[i-1][j-2][k]*calc(m-j-k+2)%mod;dp[i][j][k]%=mod;
                if (k) dp[i][j][k]+=dp[i-1][j][k-1]*(j*(m-j-k+1)%mod)%mod;dp[i][j][k]%=mod;
                if ((k>=2) && (j<=m-2)) dp[i][j][k]+=dp[i-1][j+2][k-2]*calc(j+2)%mod;
            }
    long long ans=0;
    for (int i=0;i<=m;i++)
        for (int j=0;j<=m-i;j++)
            ans=(ans+dp[n][i][j])%mod;
    printf("%lld\n",ans);
    return 0;
}

 

BZOJ 1801 中国象棋

标签:ret   bzoj   print   scan   color   状态   namespace   bsp   中国   

原文地址:http://www.cnblogs.com/ziliuziliu/p/6024888.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!