题面

状态可能不太好想,设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. head first 设计模式笔记2-观察者模式:气象观测站

    设计原则:为了交互对象之间的松耦合设计而努力. 1.设计模式的一些理解 1)知道OO基础,并不足以让你设计出良好的OO系统 2)良好的OO设计必须具备可复用.可扩充.可维护三个特性 3)模式可以让我们 ...

  2. laravel发送邮件模板中点击的链接url动态生成

    邮件模板里有url链接,生成链接有三种方式(目前总结出这三种方式)这个链接可以是: http://www.xxx.com/active?id=xxx&token=xxx   这种形式是把url ...

  3. ztree复选框

    var setting = { check: { enable: true // chkboxType : { "Y" : "", "N" ...

  4. 一致性Hash 分析和实现

    一致性Hash 分析和实现 ---title: 1.一致性Hashdate: 2018-02-05 12:03:22categories:- 一致性Hash--- 一下分析来源于网络总结:算法参照自己 ...

  5. java 手机号/身份证(*)加密隐藏中间某几位几位

    //手机号 保留前3 后4 String phone = "18771632488"; System.out.println(phone.replaceAll("(\\d ...

  6. kotlin 简单处理 回调参数 加?

    Kotlin Parameter specified as non-null is null 2017年10月18日 17:21:49 amiko_ 阅读数:9017    版权声明:本文为博主原创文 ...

  7. Docker入门-介绍和安装

    Docker容器 Docker是什么 Docker最初是dotCloud公司创建人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并于 ...

  8. 20175215 2018-2019-2 第七周java课程学习总结

    第八章 常用实用类 8.1 String类 Java专门提供了用来处理字符序列的String类.String类在java.lang包中,由于java.lang包中的类被默认引入,因此程序可以直接使用S ...

  9. 网络1911、1912 C语言第1次作业批改总结

    一.评分规则 重点检查大家代码规范,变量名.大括号换行.缩进等发现不规范倒扣3分. 助教会进PTA查看大家代码的提交列表,发现不规范或抄袭,均扣分 每次作业完成后,至少邀请3个同学点评. 原作业地址: ...

  10. WIN10下命令行禁用编辑模式

    在开发的时候 控制台输出信息 点一下右键就进入编辑模式了,WIN7没有这个问题.网上搜了一下 说是要 禁用编辑模式,下面是代码VS2005可用 { #ifndef ENABLE_EXTENDED_FL ...