题面

状态可能不太好想,设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 中国象棋 题解的更多相关文章

  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)

    题目链接:传送门 题目大意: 在N行M列的棋盘中放象棋中的“炮”,问要使得“炮”两两互不伤害,有多少种放法. 1 ≤ n,m ≤ 100,答案对9999973取模. 思路: 按行更新答案.每行炮可以放 ...

  5. 洛谷 [P2051] 中国象棋

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

  6. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  7. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  8. P2051 中国象棋

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

  9. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

随机推荐

  1. Resttemplate请求失败如何获取返回的json

    参考:https://blog.csdn.net/u011974797/article/details/82424004 https://www.cnblogs.com/liumz0323/p/106 ...

  2. Java多线程和并发(二),Thread中的start和run的区别

    目录 1.调用run方法 2.调用start方法 3.start和run的区别 二.Thread中的start和run的区别 1.调用run方法 public class ThreadTest { p ...

  3. sublime text 3插件---File Header配置

    今天趁着有点闲工夫,准备好好配置一下sublime环境,毕竟天天见面. 首当其冲的就是FileHeader插件了,安装它之后就懒得配置过.(方便起见,以下简称FH) FH是一个为文件自动添加前缀字段的 ...

  4. 如何将项目托管到Github上

    将本地项目放到GitHub上托管并展示 传送门 利用Github Pages展示自己的项目 传送门 git Please tell me who you are解决方法 传送门 git config ...

  5. 3分割线左右间距(LinearLayoutManager.VERTICAL)

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  6. AOI 设计

    http://blog.csdn.net/zhanghefu/article/details/25833535 云风的Blog 并进行整理而写. AOI(Area Of Interest),中文就是感 ...

  7. JS箭头函数的this

    箭头函数的this看定义他的时候,他的外层有没有函数 有:外层函数的this就是箭头函数的this 无:箭头函数的this就是window obj = {age:18, getAge: ()=> ...

  8. LeetCode 74. 搜索二维矩阵(Search a 2D Matrix)

    题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: ma ...

  9. leetcode 166分数到小数

    手动排除特殊情况: 对于一般情况,使用位运算和加减法来计算除法,使用sign记录结果符号:(这部分为leetcode 29题的答案) 使用hashmap来记录循环体出现的开始位置(如果有的话),使用f ...

  10. 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_09.RequestMapping注解的属性

    看下RequestMapping下面 一共有几个属性 那么属性用处不大 value和path互相为别名 这里用value表示path也是没有问题的 只有一个属性,并且属性名称叫做value那么就可以省 ...