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;
    }
  • 相关阅读:
    利用三层交换机实现VLAN间路由
    利用单臂路由实现VLAN间路由
    理解Hybrid接口的应用
    配置NAT
    OSPF 与ACL综合实验
    OSPF单区域配置
    RSTP基础配置
    配置基于全局地址池的DHCP
    静态路由及默认路由配置
    利用三层交换机实现VLAN间路由
  • 原文地址:https://www.cnblogs.com/invoid/p/5611915.html
Copyright © 2011-2022 走看看