洛谷P2051 中国象棋
题目描述
这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。你也来和小可可一起锻炼一下思维吧!
输入输出格式
输入格式:
一行包含两个整数N,M,之间由一个空格隔开。
输出格式:
总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果。
输入输出样例
1 3
7
说明
样例说明
除了3个格子里都塞满了炮以外,其它方案都是可行的,所以一共有2*2*2-1=7种方案。
数据范围
100%的数据中N和M均不超过100
50%的数据中N和M至少有一个数不超过8
30%的数据中N和M均不超过6
首先可以知道可行的方案就是每行每列的放的炮数<=2
50%数据是状压dp,然后我们发现,他的矩形是规则的而且没有障碍一类的。
那么答案就跟他的每个具体排列没有直接关系,直接用dp[i][j]表示到当前行为止有多少炮数为1的列和炮数为2的列
由于每行也最多只能放两个炮,所以可以用dp[i][j]
转移到dp[i-1][j+1](有一个炮数为1的列在此行放上一个炮)
转移到dp[i+1][j](有一个炮数为0的列在此行放上一个炮)
转移到dp[i-2][j+2](有两个炮数为1的列在此行放上一个炮)
转移到dp[i+2][j](有两个炮数为0的列在此行放上一个炮)
转移到dp[i][j+1](有一个炮数为0的列在此行放上一个炮,有一个炮数为1的列在此行放上一个炮)
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=100+10,mod=9999973;
long long n,m,dp[maxn][maxn],f[maxn][maxn],ans; int main() {
scanf("%lld%lld",&n,&m);
dp[0][0]=1;
for(int i=1;i<=n;++i) {
for(int j=0;j<=m;++j) for(int k=0;k<=m-j;++k) if(dp[j][k]){
if(j)f[j-1][k+1]=(f[j-1][k+1]+dp[j][k]*j%mod)%mod;
if(m-j-k)f[j+1][k]=(f[j+1][k]+dp[j][k]*(m-j-k)%mod)%mod; if(j>1)f[j-2][k+2]=(f[j-2][k+2]+dp[j][k]*j*(j-1)/2%mod)%mod;
if(m-j-k>1)f[j+2][k]=(f[j+2][k]+dp[j][k]*(m-j-k)*(m-j-k-1)/2%mod)%mod; if(m-j-k)f[j][k+1]=(f[j][k+1]+dp[j][k]*(m-j-k)*j%mod)%mod; f[j][k]=(f[j][k]+dp[j][k])%mod;
}
memcpy(dp,f,sizeof(f));memset(f,0,sizeof(f));
}
for(int j=0;j<=m;++j) for(int k=0;k<=m-j;++k) ans=(ans+dp[j][k])%mod;
printf("%lld",ans);
return 0;
}
洛谷P2051 中国象棋的更多相关文章
- 洛谷 - P2051 - 中国象棋 - 简单dp
https://www.luogu.org/problemnew/show/P2051 一点都不简单的简单dp. 还是从旧行转移到新行,而不是考虑新行从哪些旧行转移吧. #include<bit ...
- 洛谷P2051 中国象棋【dp】
题目:https://www.luogu.org/problemnew/show/P2051 题意:n*m的格子里放炮,使他们不能互相攻击. 如果两个炮在同一行同一列并且中间还有一个棋子的话就可以攻击 ...
- 洛谷P2051 中国象棋(dp)
题目链接:传送门 题目大意: 在N行M列的棋盘中放象棋中的“炮”,问要使得“炮”两两互不伤害,有多少种放法. 1 ≤ n,m ≤ 100,答案对9999973取模. 思路: 按行更新答案.每行炮可以放 ...
- 洛谷 [P2051] 中国象棋
DP orz__stdcall 首先要想出来,每行最多只能放两个棋子,这是显然的 于是决策就是一行一行地处理 30分的做法就是裸的枚举,暴搜,枚举这一行放哪里,放几个 然后想到了压位dp,按3进制表示 ...
- 洛谷 P2051 中国象棋 题解
题面 状态可能不太好想,设f[i][j][k]表示前i行其中有j行是放一个炮,有k行是放两个炮的合法方案数: 那么: f[i+1][j][k]+=f[i][j][k] 在这一行不放任何棋子: ...
- P2051 中国象棋
P2051 中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中 ...
- [洛谷P2051] [AHOI2009]中国象棋
洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ...
- 洛谷 P2051 [AHOI2009]中国象棋 解题报告
P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...
- 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP
P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...
随机推荐
- vim用户设置
此配置目前使用户mac,linux,win,但是win系统需要提前配置mingw32相关的gcc系统路径等信息. " Setting some decent VIM settings for ...
- 修改maven本地库路径
1.打开maven的安装路径:${M2_HOME}/conf/setings.xml文件 2.找到<localRepository>项,将它的值修改就可以了,我修改的是:${M2_HOME ...
- PL/SQl连接数据库ORA-12154错误
先说说我遇到的问题: 1.在sql/plus下可以正确连接到数据库(oracle10g): 2.检查我机器(64)位环境变量的配置,没问题.path环境变量没问题(C:\oraclexe\app\or ...
- Javascript-简单的计时钟表
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- 探索云网络技术前沿,Sigcomm 2019 阿里云参会分享
Sigcomm 2019简介 一年一度的网络顶级学术峰会Sigcomm于8月20日至22日在北京举行.作为ACM Special Interest Group on Data Communicatio ...
- 通过gevent实现单线程下的多socket并发
#通过gevent实现单线程下的多socket并发 服务器 #server side import sys import socket import time import gevent from g ...
- 工控安全入门(二)—— S7comm协议
在上一次的文章中我们介绍了施耐德公司的协议modbus,这次我们把目标转向私有协议,来看看另一家巨头西门子的S7comm.首先要说明,这篇文章中的内容有笔者自己的探索,有大佬们的成果,但由于S7com ...
- 读书笔记--Head First JQuery目录
1.JQuery入门 2.选择器与方法 3.JQuery事件与函数 4.JQuery Web页面管理 5.JQuery效果与动画 6.JQuery与JavaScript 7.定制函数停工定制效果 8. ...
- Python缩进和选择
Python缩进和选择 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这 ...
- Ajax 用法简介
使用Ajax实现页面的局部刷新 一.不依赖jquery时是这样的用法: var xhr=new XMLHttpRequest(); xhr.onreadystatechange=function(ev ...