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

题意:n*m的格子里放炮,使他们不能互相攻击。

如果两个炮在同一行同一列并且中间还有一个棋子的话就可以攻击。问有多少种放炮的方案。

思路:首先根据规则,可以推出任意的行和列中炮的个数都不能超过2个。

可以尝试用递推。$dp[i][j][k]$表示处理到第$i$行,只有一个炮的列有$j$个,有两个炮的列有$k$个时的方案数。

当$i-1$行处理完了处理$i$的时候,可以放0,1,2个炮。

所以$dp[i][j][k] = dp[i-1][j][k] + dp[i-1][j-1][k] * (m - j - k + 1) + dp[i - 1][j + 1][k - 1] * (j + 1) + dp[i - 1][j - 2][k] * (m - j - k + 2)(m - j - k + 1) + dp[i - 1][j + 2][k - 2] * (j + 2)(j + 1)/2 + dp[i- 1][j][k - 1] * j(m - j - k + 1)$【每次像这种到老是会搞乱到底是谁推出谁的关系】

注意中间过程可能会爆int,所以直接用LL做吧。

 #include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iostream> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<int, int> pr; int n, m;
const int maxn = ;
const LL mod = ;
LL dp[maxn][maxn][maxn]; int main()
{
scanf("%d%d", &n, &m);
dp[][][] = ;
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
for(int k = ; j + k <= m; k++){
dp[i][j][k] = (dp[i][j][k] + dp[i - ][j][k]) % mod;
if(j >= )dp[i][j][k] = (dp[i][j][k] + dp[i - ][j - ][k] * (m - j - k + )) % mod;
if(k >= && j + <= m)dp[i][j][k] = (dp[i][j][k] + dp[i - ][j + ][k - ] * (j + )) % mod;
if(j >= )dp[i][j][k] = (dp[i][j][k] + dp[i - ][j - ][k] * ((m - j - k + ) * (m - j - k + ) / )) % mod;
if(k >= && j + <= m)dp[i][j][k] = (dp[i][j][k] + dp[i - ][j + ][k - ] * ((j + ) * (j + ) / )) % mod;
if(k >= )dp[i][j][k] = (dp[i][j][k] + dp[i - ][j][k - ] * j * (m - j - k + )) % mod;
}
}
} LL ans = ;
for(int j = ; j <= m; j++){
for(int k = ; j + k <= m; k++){
ans = (ans + dp[n][j][k]) % mod;
}
}
printf("%lld\n", ans);
return ;
}

洛谷P2051 中国象棋【dp】的更多相关文章

  1. 洛谷P2051 中国象棋

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

  2. 洛谷 - P2051 - 中国象棋 - 简单dp

    https://www.luogu.org/problemnew/show/P2051 一点都不简单的简单dp. 还是从旧行转移到新行,而不是考虑新行从哪些旧行转移吧. #include<bit ...

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

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

  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. P2051 中国象棋

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

  7. 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP

    P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...

  8. [洛谷P2051] [AHOI2009]中国象棋

    洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ...

  9. 洛谷 P2051 [AHOI2009]中国象棋 解题报告

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

随机推荐

  1. cuda-convnet在Ubuntu12.04+CUDA5.5下的配置

    deep learning近年来非常之火,尤其是在IMAGENET上的识别效果更是惊呆了小伙伴,其所用的Hinton的学生编写的cuda-convet代码早已公开,但是一直没有时间去仔细研究,最近趁着 ...

  2. Spring之25:SingletonBeanRegistry&DefaultSingletonBeanRegistry

    此接口是针对Spring中的单例Bean设计的.提供了统一访问单例Bean的功能,BeanFactory可实现此接口以提供访问内部单例Bean的能力. //将对象(singletonObject)注册 ...

  3. 用php做管理后台

    最近因处理家庭之事,技术上没有提高,这段时间也陆续的恢复了正常的开发,由于要做一个管理后台,所以在选择语言和架构上搜了不少资料, php 和java 的选择上,后来选择用php作为管理后台开发的语言. ...

  4. Python--拦截接口

  5. 解决VS2017中使用scanf函数报错的问题

    我们在VS2017中如果使用C语言的scanf输入函数,编译的时候编译器会报error C4996: 'scanf': This function or variable may be unsafe. ...

  6. ILSVRC比赛带来的算法

    李飞飞和它的团队搜集了ImageNet一个超过15 million的图像数据集,大约有22,000类.这个文件集合对深度卷积网络极大地推进深度学习各领域的发展. ILSVRC是对ImageNet进行分 ...

  7. Oracle 11g xe版本---总结1

    一.创建用户和授予权限 1.1 环境: Oracle 11g xe 第三方图形客户端: PLSQL Windows 10 必须登录 HR 用户,下面的查询会使用到 HR 中的表. 1.2 SQL 语句 ...

  8. 【C#】课堂知识点#3

    1.讲解了实验1中,利用Char.is***来进行判断字符类型. using System; using System.Collections.Generic; using System.Linq; ...

  9. C# 简单的区块链实现

    1.项目配置 首先新建一个 Asp.Net Core 项目,然后选择 Empty Project(空项目) 类型,建立完成后无需进行任何配置. 2.数据模型 这里我们来创建一个具体的区块数据模型,使用 ...

  10. Angular 学习笔记 (动态组件 & Material Overlay & Dialog 分析)

    更新: 2019-11-24  dialog vs router link refer : https://stackoverflow.com/questions/51821766/angular-m ...