【AHOI2009】中国象棋 题解(线性DP+数学)
前言:这题主要是要会设状态,状态找对了问题迎刃而解。
---------------------------
题目描述
这次小可可想解决的难题和中国象棋有关,在一个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+数学)的更多相关文章
- BZOJ1801:[AHOI2009]中国象棋——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1801 https://www.luogu.org/problemnew/show/P2051 这次小 ...
- 洛谷P2051 [AHOI2009] 中国象棋(状压dp)
题目简介 n*m的棋盘,对每行放炮,要求每行每列炮数<=2,求方案数%9999973 N,M<=100 题目分析 算法考虑 考虑到N,M范围较小,每一行状态只与前面的行状态有关,考虑状压D ...
- 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP
P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...
- Luogu P2051 [AHOI2009]中国象棋(dp)
P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...
- [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)
题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...
- 洛谷 P2051 [AHOI2009]中国象棋 解题报告
P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...
- [洛谷P2051] [AHOI2009]中国象棋
洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ...
- luogu 2051 [AHOI2009]中国象棋
luogu 2051 [AHOI2009]中国象棋 真是一道令人愉♂悦丧心并框的好题... 首先"没有一个炮可以攻击到另一个炮"有个充分条件就是没有三个炮在同一行或同一列.证明:显 ...
- [P2051 [AHOI2009]中国象棋] DP
https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...
随机推荐
- HttpContext, HttpContextBase, HttpContextWrapper之间关系
HttpContext是最原始的ASP.NET Context. MVC的目的之一是能够单元测试. HttpContextBase, 是用来在MVC中替代HttpContext.但是这是一个abstr ...
- 从0开始,手把手教你开发并部署上线一个知识测验微信小程序
上线项目演示 微信搜索[放马来答]或扫以下二维码体验: 项目源码 项目源码 其他版本 Vue答题App实战教程 Hello小程序 1.注册微信小程序 点击立即注册,选择微信小程序,按照要求填写信息 2 ...
- 为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片?
避免跨域(img 天然支持跨域) 利用空白gif或1x1 px的img是互联网广告或网站监测方面常用的手段,简单.安全.相比PNG/JPG体积小,1px 透明图,对网页内容的影响几乎没有影响,这种请求 ...
- 使用Git GUI工具 上传本地仓库到 gitee码云仓库
前言: 网上关于git的命令操作与使用很多教程和博客,在使用git工具时我发现有一个 git Gui 可视化工具,我觉得十分的亲切,由于我之前一直是使用svn作为版本控制管理工具,都是可视化操作,使用 ...
- scrapy 基础组件专题(五):自定义扩展
通过scrapy提供的扩展功能, 我们可以编写一些自定义的功能, 插入到scrapy的机制中 一.编写一个简单的扩展 我们现在编写一个扩展, 统计一共获取到的item的条数我们可以新建一个extens ...
- 数据可视化之powerBI基础(十七)掌握PowerBI按列排序,再也不用担心顺序错乱了
https://zhuanlan.zhihu.com/p/64421933 经常有朋友问,当把文本字段放到坐标轴或者切片器上,显示的顺序都乱了,完全不是自己想要的,就像下面这些, ↑月份坐标轴 ↑星期 ...
- spring security简单登录的认证
一.思路 1.先导入相关配置(使用spring security校验之后,登录拦截的配置) 2.创建一个 WebSecurityConfig 继承 WebSecurityConfigurerAdapt ...
- Burp Suite Decoder Module - 解码模块
官方参考链接:https://portswigger.net/burp/documentation/desktop/tools/decoder 该模块主要进行编码和解码,支持编码方式有:Plain,U ...
- Spring IoC深入理解
本文相关代码(来自官方源码spring-test模块)请参见spring-demysify org.springframework.mylearntest包下. 三种注入方式 1.构造方法注入 pub ...
- CSS变形动画
CSS变形动画 前言 在开始介绍CSS变形动画之前,可以先了解一下学习了它之后能做什么,有什么用,这样你看这篇文章可能会有一些动力. 学习了CSS变形动画后,你可以为你的页面做出很多炫酷的效果,如一个 ...