前言:这题主要是要会设状态,状态找对了问题迎刃而解。

---------------------------

题目描述

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

输入格式

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

输出格式

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

数据范围

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

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

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

----------------------------------------------

设$f[i][j][k]$表示前$i$行中有$j$列放$1$个棋子,有$k$列放两个棋子的方案数。

自然而然考虑三种情况:

1.这一行不放棋子:$f[i][j][k]=f[i-1][j][k]$

2.这一行放一个棋子:

(1)选择在没有棋子的一列放一个棋子:$f[i][j][k]+=f[i][j-1][k]*(m-(j-1)-k)$

(2)选择在有$1$个棋子的一列放一个棋子:$f[i][j][k]+=f[i-1][j+1][k-1]*(j+1)$

3.这一行放两个棋子:

(1)$1$个棋子放在有$1$个棋子的一列,$1$个棋子放在没有棋子的一列:$f[i][j][k]+=f[i-1][j][k-1]*j*(m-j-(k-1))$(拥有$1$个棋子的列数是不变的(-1+1),拥有$2$个棋子的列数+1)

(2)$2$个棋子都放在有$1$个棋子的列上:$f[i][j][k]+=f[i-1][j+2][k-2]*C_{j+2}^2$

(3)$2$个棋子都放在没有棋子的列上:$f[i][j][k]+=f[i-1][j-2][k]*C_{m-(j-2)-k}^2$

写的时候考虑边界,最好开$long \ long$。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=;
int f[][][],n,m,ans;
int C(int a)
{
return (a*(a-)/)%mod;
}
signed main()
{
scanf("%d%d",&n,&m);
f[][][]=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int k=;k<=m-j;k++)
{
f[i][j][k]=f[i-][j][k];
if(k>=)(f[i][j][k]+=f[i-][j+][k-]*(j+));
if(j>=)(f[i][j][k]+=f[i-][j-][k]*(m-j-k+));
if(k>=)(f[i][j][k]+=f[i-][j+][k-]*(((j+)*(j+))/));
if(k>=)(f[i][j][k]+=f[i-][j][k-]*j*(m-j-k+));
if(j>=)(f[i][j][k]+=f[i-][j-][k]*C(m-j-k+));
f[i][j][k]%=mod;
}
for (int i=;i<=m;i++)
for (int j=;j<=m;j++) ans=(ans+f[n][i][j])%mod;
printf("%lld",(ans+mod)%mod);
return ;
}

【AHOI2009】中国象棋 题解(线性DP+数学)的更多相关文章

  1. BZOJ1801:[AHOI2009]中国象棋——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1801 https://www.luogu.org/problemnew/show/P2051 这次小 ...

  2. 洛谷P2051 [AHOI2009] 中国象棋(状压dp)

    题目简介 n*m的棋盘,对每行放炮,要求每行每列炮数<=2,求方案数%9999973 N,M<=100 题目分析 算法考虑 考虑到N,M范围较小,每一行状态只与前面的行状态有关,考虑状压D ...

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

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

  4. Luogu P2051 [AHOI2009]中国象棋(dp)

    P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...

  5. [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...

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

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

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

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

  8. luogu 2051 [AHOI2009]中国象棋

    luogu 2051 [AHOI2009]中国象棋 真是一道令人愉♂悦丧心并框的好题... 首先"没有一个炮可以攻击到另一个炮"有个充分条件就是没有三个炮在同一行或同一列.证明:显 ...

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

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

随机推荐

  1. day47 数据库进阶

    目录 一.select查询扩展 1 几个重要关键字的执行顺序 2 where筛选条件 3 group by分组 4 having 分组之后的筛选条件 5 distinct去重 6 order by 排 ...

  2. node+express+static完成简单的文件下载

    不多说什么,直接上代码 var express = require('express'); var fs = require('fs') var path= require('path'); var ...

  3. java 面向对象(三十):异常(三) 手动抛出异常对象

    1.使用说明在程序执行中,除了自动抛出异常对象的情况之外,我们还可以手动的throw一个异常类的对象. 2.[面试题] throw 和 throws区别:throw 表示抛出一个异常类的对象,生成异常 ...

  4. Mesos+Zookeeper+Marathon+Docker环境搭建

    相关理论请参考:https://www.cnblogs.com/Bourbon-tian/p/7155054.html,本文基于https://www.cnblogs.com/Bourbon-tian ...

  5. 【Python学习笔记四】获取html内容之后,如何提取信息:使用正则表达式筛选

    在能够获取到网页内容之后,发现内容很多,那么下一步要做信息的筛选,就和之前的筛选图片那样 而在python中可以通过正则表达式去筛选自己想要的数据 1.首先分析页面内容信息,确定正则表达式.例如想获取 ...

  6. ajax原生js封装

    不带注释的 function ajax(json) { json.type = json.type ? json.type : 'get'; json.async = json.async == fa ...

  7. 利用华为eNSP模拟器实现vlan之间的通信

    eNSP交换机配置VLAN 1. 搭建网络拓扑结构 运行eNSP>新建拓扑>搭建如下图的拓扑结构>启动设备.利用调色板将划分的vlan进行区分. 2. pc机IP地址配置 pc1的I ...

  8. org.apache.commons.net.ftp.FTPConnectionClosedException: Connection closed without indication

    Ftp问题 最近遇到了ftp读取中文乱码的问题,代码中使用的是FtpClient.google一下找到了解决方案. FTP协议里面,规定文件名编码为iso-8859-1,FTP类中默认的编码也是这个. ...

  9. windows上Scrapy 框架的安装

    采用在命令行直接安装的方式:pip install scrapy报错:   到这个网站下载 Twisted:https://www.lfd.uci.edu/~gohlke/pythonlibs/进入网 ...

  10. Cypress系列(41)- Cypress 的测试报告

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 注意 51 testting 有一篇文章 ...