https://www.luogu.org/problemnew/show/P2051

一点都不简单的简单dp。

还是从旧行转移到新行,而不是考虑新行从哪些旧行转移吧。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; namespace combinatorics{
const ll MOD=9999973; //1. 快速幂 x^n %mod
inline ll qpow(ll x,ll n,ll mod=MOD) {
ll res=1%mod;
while(n) {
if(n&1)
res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res;
} //3. 乘法逆元 快速幂+费马小定理,要求p必须是质数 (依赖1. 快速幂)
inline ll inv_p(ll n,ll p=MOD) {
return qpow(n,p-2,p);
} }; using namespace combinatorics;
//注意需要init(),必要时修改常量 ll dp[101][101][101]={};
//前i行中,j列放了1个,k列放了2个的方法数 int main(){
int n,m;
scanf("%d%d",&n,&m); ll inv2=inv_p(2,MOD); dp[1][0][0]=1;
//不放也是一种方法
dp[1][1][0]=m;
//只有1列放了1个
if(m>=2)
dp[1][2][0]=(ll)m*(m-1)%MOD*inv2%MOD; //只有2列放了1个
for(int i=1;i<n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=m-j;k++){
//这一行不放
dp[i+1][j][k]=(dp[i+1][j][k]+dp[i][j][k])%MOD; int v=m-j-k;
//放一个在空列,有v种放法
if(v-1>=0&&j+1<=m)
dp[i+1][j+1][k]=(dp[i+1][j+1][k]+dp[i][j][k]*v)%MOD;
//放一个在原本有1个的列,有j种方法
if(j-1>=0&&k+1<=m)
dp[i+1][j-1][k+1]=(dp[i+1][j-1][k+1]+dp[i][j][k]*j)%MOD;
//放两个,两个都在空列
if(v-2>=0&&j+2<=m)
dp[i+1][j+2][k]=(dp[i+1][j+2][k]+dp[i][j][k]*(v)*(v-1)*inv2)%MOD;
//放两个,两个都在原本有1个的列
if(j-2>=0&&k+2<=m)
dp[i+1][j-2][k+2]=(dp[i+1][j-2][k+2]+dp[i][j][k]*(j)*(j-1)*inv2)%MOD;
//放两个,一个在空列,一个在原本有1个的列
if(v-1>=0&&k+1<=m)
dp[i+1][j][k+1]=(dp[i+1][j][k+1]+dp[i][j][k]*v*j)%MOD; //printf("dp[%d][%d][%d]=%lld\n",i,j,k,dp[i%2][j][k]);
}
}
} //puts(""); ll ans=0;
for(int j=0;j<=m;j++){
for(int k=0;k<=m-j;k++){
ans=(ans+dp[n][j][k])%MOD;
//printf("dp[%d][%d][%d]=%lld\n",n,j,k,dp[n%2][j][k]);
}
}
printf("%lld\n",ans);
}

洛谷 - P2051 - 中国象棋 - 简单dp的更多相关文章

  1. 洛谷P2051 中国象棋【dp】

    题目:https://www.luogu.org/problemnew/show/P2051 题意:n*m的格子里放炮,使他们不能互相攻击. 如果两个炮在同一行同一列并且中间还有一个棋子的话就可以攻击 ...

  2. 洛谷P2051 中国象棋(dp)

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

  3. 洛谷P2051 中国象棋

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

  4. 洛谷 [P2051] 中国象棋

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

  5. 洛谷 P2051 中国象棋 题解

    题面 状态可能不太好想,设f[i][j][k]表示前i行其中有j行是放一个炮,有k行是放两个炮的合法方案数: 那么: f[i+1][j][k]+=f[i][j][k]     在这一行不放任何棋子: ...

  6. 洛谷P1130红牌(简单DP)

    题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括NNN个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都 ...

  7. 洛谷 - P1002 - 过河卒 - 简单dp

    https://www.luogu.org/problemnew/show/P1002 方程很好想,题目也很暴力.感谢题目提示数据会很大. #include<bits/stdc++.h> ...

  8. 【Luogu】P2051中国象棋(DP)

    题目链接 去看STDCALL的题解吧 #include<cstdio> #include<cctype> #define mod 9999973 inline long lon ...

  9. P2051 中国象棋

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

随机推荐

  1. smartUpload注意过程

    操作的过程中一定要注意的几个方面:       1.将smartUpload.jar拷贝到tomcat/lib以及项目的lib下面,最好是只多不少!       2.因为上传的文件一般都很大,所以应该 ...

  2. Python自动生成文章

    为了应付某些情况,需要做17份记录.虽然不很重要,但是17份完全雷同也不很好.大体看了一下,此记录大致分为四段.于是决定每段提供四种选项,每段四选一,拼凑成四段文字,存成一个文件.文件名就叫“XX记录 ...

  3. Angularv4入门篇1

    国庆时按照官网的tutorial写了遍官方示例,一知半解,不明白angular的服务的服务为何要单独抽离出来.angular应用是如何启用的.近期打算看下angular的文档部分,然后梳理遍以理解an ...

  4. Spring AOP(转载)

    此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另一方 ...

  5. SegmentFault 巨献 1024 程序猿游戏「红岸的呼唤」第二天任务攻略

    眼看实验室就要关门了.走之前写一下解题过程(事实上大家都等着第三题出来吧大概-=). 高速传送门:http://segmentfault.com/game/2 那么接昨天的博客,今天的题目是这种: 完 ...

  6. RESTful设计模式状态码code说明

    一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. 下面是标准RESTfu ...

  7. UIAlertController Changes in iOS 8

    本文转载至 http://www.th7.cn/Program/IOS/201409/276000.shtml   As part of the theme of iOS 8 to make inte ...

  8. funhub 独立游戏团队诚邀策划,美术,技术,QA 大大加入(可远程办公)

    我们刚成立的的独立游戏团队,base:广州,团队陆陆续续已经有 6 个成员了,现在还缺的岗位有策划,美术.不过有其 他岗位的仁人志士也可加入. 另外,我们支持远程办公,这是互联网行业的天然优势,一定要 ...

  9. 在VC++空工程中使用MFC类,采用Unicode字符集后,运行工程程序报错的解决方案

    创建一个VC++空工程,将Project Properties->General->Use of MFC改为Use MFC in a Shared DLL 新建一个源文件,内容如下 #in ...

  10. rac_udev建立磁盘方式安装grid时不识别磁盘

    原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...