P2051 中国象棋

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

  • 思路:用f[i][j][k]表示前i行,有j列只有1个棋子,有k列有2个棋子的方案数
  • 代码:
#include <cstdio>
#include <algorithm>
#include <cctype>
#include <iostream>
#include <cstring>
using namespace std; #define res register int
typedef long long LL;
const int N=110;
const int mod=9999973;
int n,m;
LL f[N][N][N];//前i行已经放好,其中只放了一个的列有j列,放了两个的列有k列
inline int calc(int x)//在x个数中选2个的方案数
{
return x*(x-1)/2;
} int main()
{
scanf("%d %d",&n,&m);
f[0][0][0]=1;
for(res i=0 ; i<=n-1 ; ++i)
for(res j=0 ; j<=m ; ++j)
for(res k=0 ; k+j<=m ; ++k)
if(f[i][j][k])
{
f[i+1][j][k]=(f[i+1][j][k]+f[i][j][k])%mod; if(m-j-k>=1)//放1个在有空余的列
f[i+1][j+1][k]=(f[i+1][j+1][k]+(m-j-k)*f[i][j][k])%mod;
if(j>=1)//放1个在已经有
f[i+1][j-1][k+1]=(f[i+1][j-1][k+1]+j*f[i][j][k])%mod;
if(m-j-k>=2)
f[i+1][j+2][k]=(f[i+1][j+2][k]+calc(m-j-k)*f[i][j][k])%mod;
if(m-j-k>=1 && j>=1)//放2个,1个在已经有的,另一个在没有的
f[i+1][j][k+1]= (f[i+1][j][k+1]+j*(m-j-k)*f[i][j][k])%mod;
if(j>=2)
f[i+1][j-2][k+2]=(f[i+1][j-2][k+2]+calc(j)*f[i][j][k])%mod;
}
LL ans=0;
for(res i=0 ; i<=m ; ++i)
for(res j=0 ; i+j<=m ; ++j)
ans=(ans+f[n][i][j])%mod;
cout<<ans<<endl;
return 0;
}

  

P2051 中国象棋的更多相关文章

  1. 洛谷P2051 中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  2. 洛谷 - P2051 - 中国象棋 - 简单dp

    https://www.luogu.org/problemnew/show/P2051 一点都不简单的简单dp. 还是从旧行转移到新行,而不是考虑新行从哪些旧行转移吧. #include<bit ...

  3. 洛谷P2051 中国象棋【dp】

    题目:https://www.luogu.org/problemnew/show/P2051 题意:n*m的格子里放炮,使他们不能互相攻击. 如果两个炮在同一行同一列并且中间还有一个棋子的话就可以攻击 ...

  4. 洛谷P2051 中国象棋(dp)

    题目链接:传送门 题目大意: 在N行M列的棋盘中放象棋中的“炮”,问要使得“炮”两两互不伤害,有多少种放法. 1 ≤ n,m ≤ 100,答案对9999973取模. 思路: 按行更新答案.每行炮可以放 ...

  5. 洛谷 [P2051] 中国象棋

    DP orz__stdcall 首先要想出来,每行最多只能放两个棋子,这是显然的 于是决策就是一行一行地处理 30分的做法就是裸的枚举,暴搜,枚举这一行放哪里,放几个 然后想到了压位dp,按3进制表示 ...

  6. 【Luogu】P2051中国象棋(DP)

    题目链接 去看STDCALL的题解吧 #include<cstdio> #include<cctype> #define mod 9999973 inline long lon ...

  7. 洛谷 P2051 中国象棋 题解

    题面 状态可能不太好想,设f[i][j][k]表示前i行其中有j行是放一个炮,有k行是放两个炮的合法方案数: 那么: f[i+1][j][k]+=f[i][j][k]     在这一行不放任何棋子: ...

  8. [P2051 [AHOI2009]中国象棋] DP

    https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...

  9. 洛谷 P2051 [AHOI2009]中国象棋 解题报告

    P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...

随机推荐

  1. errorlevel 续2

    -------siwuxie095             %ERRORLEVEL%值一览表:     ATTRIB.EXE (a) Target file/folder not found = ER ...

  2. 转载《spring定时任务轮询(spring Task)》

    亲测可用 原文网址:http://blog.csdn.net/wanglha/article/details/51026697 本博主注:xmlns:task="http://www.spr ...

  3. Linq多字段排序

    var q = db.Customers.OrderBy(c => c.City).ThenBy(c => c.ContactName).ToList(); var q = from it ...

  4. mongodb的安装与启动(centos7)

    公司迁移mongodb,查了半天资料,各种考证,各种资讯,最后我选择很野蛮的直接把库和日志直接scp过来了....... 记录下如何安装和启动mongodb: 1.解压mongodb: [root@i ...

  5. popupWindow自适应大小

    // popupWindow自适应大小 popupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP ...

  6. 09 Finding a Motif in DNA

    Problem Given two strings ss and tt, tt is a substring of ss if tt is contained as a contiguous coll ...

  7. Gym 100792C Colder-Hotter (三分)

    题意:系统有一个点对,让你去猜,每次你猜一个,如果这个数和系统里的那个点距离比上一个你猜的近,那么返回1,否则返回0,第一次猜一定返回0,在不超过500次的情况下,猜出正确答案. 析:是一个简单的三分 ...

  8. linux 查找php.ini在那个文件夹

    第一种方法:通过phpinfo查看 第二种方法: 执行 php -i | grep php.ini 结果如下:

  9. 测试用Word2007发布博客文章

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  10. Base64编码说明

    Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式. 如果剩下的字符不足3个字节,则用0填充 ...