zoukankan      html  css  js  c++  java
  • bzoj1801: [Ahoi2009]chess 中国象棋

    dp。

    如果状压dp的话,只能拿到50分。而正解既比状压好写,又是正解。。

    f[i][j][k]表示第i行有j列有一个棋子,有k列有俩个棋子,然后dp转移一下就好了(方程太难写,不写了。。。)

    100*100*mod可能爆int,所以用了long long。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    typedef long long LL;
    const int maxn = 100 + 10;
    const LL mod = 9999973;
    LL f[maxn][maxn][maxn];
    LL n,m,res;
    
    int main() {
        scanf("%lld%lld",&n,&m);
        memset(f,0,sizeof(f));
        f[0][0][0]=1;
        for(LL i=1;i<=n;i++) {
            for(LL j=0;j<=m;j++)
            for(LL k=0;k<=m;k++) if(j+k<=m){
                LL &h = f[i][j][k];
                h=(h+f[i-1][j][k])%mod;
                if(j>=1) h=(h+f[i-1][j-1][k]*(m-j-k+1))%mod;
                if(k>=1) h=(h+f[i-1][j+1][k-1]*(j+1))%mod;
                if(j>=2) h=(h+f[i-1][j-2][k]*((m-j-k+1)*(m-j-k+2)/2))%mod;
                if(k>=1) h=(h+f[i-1][j][k-1]*(m-j-k+1)*j)%mod;            
                if(k>=2) h=(h+f[i-1][j+2][k-2]*((j+2)*(j+1)/2))%mod;
            }
        }
        
        res=0;
        for(int i=0;i<=m;i++) 
        for(int j=0;j<=m;j++) if(i+j<=m) res=(res+f[n][i][j])%mod;
        printf("%lld
    ",res);
        return 0;
    }
  • 相关阅读:
    09_ssh服务器的安装和使用
    08_linux下的文件压缩和解压
    38-自定义异常类
    37-手动抛出异常对象
    DataGrip 2020.1 安装与激活
    36-异常的处理
    35-异常
    node+ajax实战案例(1)
    ajax前后端交互原理(7)
    ajax前后端交互原理(5)
  • 原文地址:https://www.cnblogs.com/invoid/p/5611915.html
Copyright © 2011-2022 走看看