问题标题: 洛谷:2051

0
0
已解决
尹宗鑫
尹宗鑫
新手守护
新手守护

2051 中国象棋

题目描述

这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。你也来和小可可一起锻炼一下思维吧!

输入输出格式

输入格式:

 

一行包含两个整数N,M,之间由一个空格隔开。

 

输出格式:

 

总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果。

 

输入输出样例

输入样例#1: 复制

1 3

输出样例#1: 复制

7

说明

样例说明

除了3个格子里都塞满了炮以外,其它方案都是可行的,所以一共有2*2*2-1=7种方案。

数据范围

100%的数据中N和M均不超过100

50%的数据中N和M至少有一个数不超过8

30%的数据中N和M均不超过6

回答代码,不要回答网址


0
已采纳
黄昊轩
黄昊轩
新手守护
新手守护

typedef long long ll;

const ll mod=9999973;

const int N=1e2+20;

int n,m;

ll dp[N][N][N];//dp[i][j][k] 已经放了i行 有j列放一个炮,有k列放2个炮

ll C(ll x)

{

    return x*(x-1)/2;

}

int main()

{

    while(cin>>n>>m)

    {

        memset(dp,0,sizeof(dp));

        dp[0][0][0]=1;

        for(int i=0;i<n;i++)

        {

            for(int j=0;j<=m;j++)

            {

                for(int k=0;k<=m-j;k++)

                {

                    dp[i+1][j][k]=(dp[i+1][j][k]+dp[i][j][k])%mod;//第i+1行不放

                     

                    //第i+1行 放一个

                    if(m-j-k>=1)

                        dp[i+1][j+1][k]=(dp[i+1][j+1][k]+dp[i][j][k]*(m-j-k))%mod;//放在空列上

                    if(j-1>=0)

                        dp[i+1][j-1][k+1]=(dp[i+1][j-1][k+1]+dp[i][j][k]*j)%mod;//放在有一个棋子的列上   

                 

                    //第i+1行 放两个

                    if(m-j-k>=2)

                        dp[i+1][j+2][k]=(dp[i+1][j+2][k]+dp[i][j][k]*C(m-j-k))%mod;//空列

                    if(m-j-k>=1&&j>=1)

                        dp[i+1][j][k+1]=(dp[i+1][j][k+1]+dp[i][j][k]*(m-j-k)*j)%mod;//一个在空列,一个在有一个棋子的列上

                    if(j-2>=0)

                        dp[i+1][j-2][k+2]=(dp[i+1][j-2][k+2]+dp[i][j][k]*C(j))%mod;//两个都在有一个棋子的列上

                     

                }

            }

        }

        ll ans=0;

        for(int j=0;j<=m;j++)

            for(int k=0;k<=m-j;k++)

                ans=(ans+dp[n][j][k])%mod;

        cout<<ans<<endl;

    }

0
0
0
梁锦程
梁锦程
高级光能
高级光能

哇!突然发现这么多大佬,竟然做紫题

这题本蒟蒻也不会(-_-||

但这题可以用DP做

0
我要回答