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

    1801: [Ahoi2009]chess 中国象棋

    Time Limit: 10 Sec  Memory Limit: 64 MB

    Description

    在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧.

    Input

    一行包含两个整数N,M,中间用空格分开.

    Output

    输出所有的方案数,由于值比较大,输出其mod 9999973

    Sample Input

    1 3

    Sample Output

    7

    HINT

    除了在3个格子中都放满炮的的情况外,其它的都可以.

    100%的数据中N,M不超过100
    50%的数据中,N,M至少有一个数不超过8
    30%的数据中,N,M均不超过6

    Source

    Day2

    Tips:

      这是道很好的dp题,我讲不清楚还是看别人博客较好;

    Code:

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #define MOD 9999973
    using namespace std;
    long long n,m,dp[108][108][108],ans;
    
    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];
            if(j>=1) dp[i][j][k]=(dp[i][j][k]+dp[i-1][j-1][k]*(m-j-k+1))%MOD;            
            if(k-1>=0&&j+1<=m) dp[i][j][k]=(dp[i][j][k]+dp[i-1][j+1][k-1]*(j+1))%MOD;
            if(j-2>=0) dp[i][j][k]=(dp[i][j][k]+dp[i-1][j-2][k]*(m-j-k+2)*(m-j-k+1)/2)%MOD;
            if(j+2<=m&&k-2>=0) dp[i][j][k]=(dp[i][j][k]+dp[i-1][j+2][k-2]*(j+2)*(j+1)/2)%MOD;
            if(j>=1&&k+1<=m) dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k-1]*(m-j-k+1)%MOD*j)%MOD;
            if(i==n) ans=(ans+dp[i][j][k])%MOD;
        }
        printf("%lld",ans);
    }
  • 相关阅读:
    Linux-05安装python3,jupyter(朱皮特)
    Linux-04Vim
    calloc()的使用
    根目录挂载位置错误记录
    arm裸机通过uboot运行hello world程序测试结果
    编译Uboot——错误记录
    将make的输出重定向到文件(转)
    Linux下JDK+Eclipse安装
    使用gdb+core查看错误信息
    Ubuntu下安装tftp
  • 原文地址:https://www.cnblogs.com/WQHui/p/7536589.html
Copyright © 2011-2022 走看看