题目链接:传送门

题目大意:

  在N行M列的棋盘中放象棋中的“炮”,问要使得“炮”两两互不伤害,有多少种放法。

  1 ≤ n,m ≤ 100,答案对9999973取模。

思路:

  按行更新答案。每行炮可以放在空列(下称A列)和有一个炮的列(下称B列),从而生成B列和有两个炮的列(C列),所以更新行的时候有这样几种选择:

①不放“炮”;

②选一个A列放一个“炮”,生成一个B列;

③选一个B列放一个“炮”,生成一个C列;

④选两个A列放一个“炮”,生成两个B列;

⑤选两个B列放一个“炮”,生成两个C列;

⑥选一个A列和一个B列各放一个“炮”,生成一个B列和一个C列;(注意在同一行不能放两个棋子在同一列,所以不能看作用一个A列生成一个C列)

考虑到各行各列的顺序与答案无关:

状态

  f[i][j][k]:第i行有j个B列和k个C列。

初始状态:

  f[0][0][0] = 1;

状态转移方程:

  ①f[i][j][k] = f[i-1][j][k];

  ②f[i][j][k] = f[i-1][j-1][k] ×(i-1行A列个数);

  ③f[i][j][k] = f[i-1][j+1][k-1] ×(i-1行B列个数);

  ④f[i][j][k] = f[i-1][j-2][k] ×(i-1行A列个数选2);

  ⑤f[i][j][k] = f[i-1][j+2][k-2] ×(i-1行B列个数选2);

  ⑥f[i][j][k] = f[i-1][j][k-1] ×(i-1行A列个数)×(i-1行B列个数);

注意边界和取模即可。

时间复杂度:O(nm2)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAX_N = ;
const int MOD = ; ll f[MAX_N][MAX_N][MAX_N]; inline int C(int n)
{//n选2
return n*(n-)/;
} int main()
{
int N, M;
cin >> N >> M;
f[][][] = ;
for (int i = ; i <= N; i++) {
for (int j = ; j <= M; j++) {
for (int k = ; k+j <= M; k++) {
//放1个
if (j- >= && (M-(j-+k)) >= )
f[i][j][k] = (f[i][j][k] + f[i-][j-][k] * (M-(j-+k))) % MOD;
if (j+ <= M && k >= )
f[i][j][k] = (f[i][j][k] + f[i-][j+][k-] * (j+)) % MOD;
//放两个
if (j- >= && (M-(j-+k)) >= )
f[i][j][k] = (f[i][j][k] + f[i-][j-][k] * C(M-(j-+k))) % MOD;
if (k >= && (M-(j+k-)) >= && j >= )
f[i][j][k] = (f[i][j][k] + f[i-][j][k-] * (M-(j+k-)) * j) % MOD;
if (k >= )
f[i][j][k] = (f[i][j][k] + f[i-][j+][k-] * C(j+)) % MOD;
//不放
f[i][j][k] = (f[i][j][k] + f[i-][j][k]) % MOD;
}
}
}
ll ans = ;
for (int j = ; j <= M; j++)
for (int k = ; k+j <= M; k++)
ans = (ans + f[N][j][k]) % MOD;
cout << ans << endl;
return ;
}

洛谷P2051 中国象棋(dp)的更多相关文章

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

  5. 洛谷 P2051 中国象棋 题解

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

  6. P2051 中国象棋

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

  7. 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP

    P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...

  8. [洛谷P2051] [AHOI2009]中国象棋

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

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

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

随机推荐

  1. 主流Linux发行版简介

    发行版 包格式 所属厂商 发布年份 最新版本 说明 RHEL RPM RedHat 2004 7.3 RedHat Linux9.0后的企业方向,系统可以免费下载安装但无法使用官方yum源 Fedor ...

  2. VNC安装配置及连接(CentOS)

    1.安装VNC yum install -y tigervnc-server #安装VNC服务端,一般执行此句即可yum groupinstall -y 'X Window System' 'Desk ...

  3. thinkphp 3.2 加载第三方库 第三方命名空间库

    tp 自动加载的介绍: http://document.thinkphp.cn/manual_3_2.html#autoload 第三方库不规范库 不适用命名空间的库 可以使用import函数导入,其 ...

  4. JSP页面间的传值方法总结

    JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧.试着将各种方式总结下来,需要时可以进行权衡利弊选择最合适的方式.下面来一起看看详细的介绍: 1. URL 链接后追加参数 ? 1 ...

  5. nginx;keepalived配置出现主主的解决方法(脑裂问题)

    1.查看日志 tail -f /var/log/messages 发现master和backup机都是mastaer模式启动的 通过查看别人的经历,发现VRRP基于报文实现的.master设置一定时间 ...

  6. JavaScript -基础- 函数与对象

    一.JavaScript三对象 1.分类方式一 1)ECMAScript JavaScript的ECMA规范 JS本身的对象 2)Dom 操作HTML相关 3)BOM游览器对象 游览器窗口对象,全局的 ...

  7. SQL-4查找所有已经分配部门的员工的last_name和first_name(自然连接)

    题目描述 查找所有已经分配部门的员工的last_name和first_nameCREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL,`dept_no` ...

  8. DevExpress WinForms使用教程:图表控件 - 内置深入查询

    [DevExpress WinForms v18.2下载] 在最新发布的DevExpress WinForms v18.2中,DevExpress WinForms和ASP.NET图表控件引入嵌套系列 ...

  9. 从今天开始 每天记录HTML,CSS 部分的学习笔记

    从今天开始 每天记录HTML,CSS 部分的学习笔记

  10. Ionic2开发环境搭建、项目创建调试与Android应用的打包、优化

    Ionic2开发环境搭建.项目创建调试与Android应用的打包.优化. windows下ionic2开发环境配置步骤如下: 下载node.js环境,稳定版本:v6.9.5 下载android stu ...