洛谷 P2051 中国象棋 题解
状态可能不太好想,设f[i][j][k]表示前i行其中有j行是放一个炮,有k行是放两个炮的合法方案数;
那么:
f[i+1][j][k]+=f[i][j][k] 在这一行不放任何棋子;
f[i+1][j+1][k]+=f[i][j][k]*(m-k-j); 在剩余的m-k-j个空行中随机选择一个放下一个炮;
f[i+1][j-1][k+1]+=f[i][j][k]*(j); 在有一个棋子的j行中随机选择一个放下一个炮,则拥有两个炮的行数便加1;
f[i+1][j-2][k]+=f[i][j][k]*C(m-k-j,2); 在剩余的m-k-j个空行中随机选择两个不相同的行(利用组合数);
f[i+1][j][k+1]+=f[i][j][k]*(m-k-j)*j; 选择一个放了一个炮的行和一个没放炮的行各放一个炮;
f[i+1][j-2][k+2]+=f[i][j][k]*C(j,2); 选择两个放了一个炮的行各放一个炮;
注意数组的下标不可以是负数!!!!!
ans就是sigma(f[n][j][k])(j+k<=m)
注意边界处理 ,a[0][0][0]=1;
#include <bits/stdc++.h>
#define int long long
#define p 9999973
using namespace std;
int N,M;
int f[][][];
int C(int n)
{
return n*(n-)/;
}
signed main()
{
cin>>N>>M;
f[][][]=;
for(int i=;i<N;i++){
for(int j=;j<=M;j++){
for(int k=;k+j<=M;k++){
f[i+][j][k]=(f[i+][j][k]+f[i][j][k])%p;
if(M-k-j>=) f[i+][j+][k]=(f[i+][j+][k]+f[i][j][k]*(M-k-j))%p;
if(j>=) f[i+][j-][k+]=(f[i+][j-][k+]+f[i][j][k]*j)%p;
if(M-k-j>=) f[i+][j+][k]=(f[i+][j+][k]+f[i][j][k]*C(M-j-k))%p;
if(M-j-k>=&&j>=)f[i+][j][k+]=(f[i+][j][k+]+f[i][j][k]*(M-j-k)*j)%p;
if(j>=) f[i+][j-][k+]=(f[i+][j-][k+]+f[i][j][k]*C(j))%p;
}
}
}
long long ans=;
for(int i=;i<=M;i++){
for(int j=;i+j<=M;j++){
ans=(ans+f[N][i][j])%p;
}
}
cout<<ans;
}
洛谷 P2051 中国象棋 题解的更多相关文章
- 洛谷P2051 中国象棋
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- 洛谷 - 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进制表示 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- P2051 中国象棋
P2051 中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中 ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
随机推荐
- 直接选择排序(Straight Selection Sort)
1.定义 选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕. 常用的选择排序方法有直接选择排序和堆 ...
- poj2386(dfs搜索水题)
Language:Default Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42069 ...
- POJ 2195 一人一房 最小费用流 建图 水题
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21010 Accepted: 10614 Desc ...
- mv:移动文件或改名
mv 命令(move 的缩写),既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名.该命令的基本格式如下: mv [选项] 源文件 目标文件 选项: -f:强制覆盖,如果目标文件已经存 ...
- Postman(二)、调试模式
postman提供了一个调试模式,很方便我们写脚本以及断言 在脚本中用console.log()打印,到控制台查看 比如写入如下脚本: 点击Send后,在控制台可以看到如下信息
- 笔记本电脑如何同时上内外网(通过usb外接网卡实现虚拟机连外网)
我们这里达成的方式不是内外网切换,而是真正意义上的同时上内网和外网 原理: 通过构建虚拟机,利用usb外接网卡(某宝某东都有售,价格在50大洋左右)使虚机连接外网,然后开启虚拟机的unity模式 准备 ...
- Spark学习(二)——RDD的设计与运行原理
Spark的核心是建立在统一的抽象RDD之上,使得Spark的各个组件可以无缝进行集成,在同一个应用程序中完成大数据计算任务.RDD的设计理念源自AMP实验室发表的论文<Resilient Di ...
- 怎样查看explorer里运行的DLL文件
怎样查看explorer里运行的DLL文件 tasklist /m /fi "imagename eq explorer.exe">a.txt 列出explorer用的所有模 ...
- sql总结-----基本查询
创建一个测试表,插入一些测试数据: Create Table Cstable (Id Int,Age Int,Name Varchar2(8),Address Varchar2(20)); Inser ...
- Windows10无法打开NVIDA控制面板
今天开机,突然发现NVIDA控制面板无法打开,在桌面右键启动nView Desktop Manager,点击启动,发现也无法启动控制面板,并且提示[您当前未使用连接到nvidia gpu的显示器].查 ...