Description

在 $n * m$ 的格子上放若干个炮, 使得每个炮都不能攻击到其他炮

Solution

定义数组f[ i ][ j ][ k ] 表示到了第 i 行, 已经有2个炮的列数为 j, 有1个炮的列数 为k, 的方案数有多少。

然后就能非常简单的写个dp了

Code

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define per(i,a,b) for(int i = (a); i >= (b); --i)
#define rd read()
using namespace std; const int N = ;
const int mod = ; int n, m, op, ans;
int f[][N][N]; int read() {
int X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} int C(int a) {
return ((a - ) * a / ) % mod;
} int main()
{
n = rd; m = rd;
f[][][] = ;
rep(i, , n) {
op ^= ;
rep(j, , m) rep(k, , m - j) {
f[op][j][k] = f[op ^ ][j][k];
if(k >= ) f[op][j][k] = (f[op][j][k] + 1LL * (m - j - k + ) * f[op ^ ][j][k - ] % mod) % mod;
if(j >= ) f[op][j][k] = (f[op][j][k] + 1LL * (k + ) * f[op ^ ][j - ][k + ] % mod) % mod;
if(k >= ) f[op][j][k] = (f[op][j][k] + 1LL * C(m - j - k + ) * f[op ^ ][j][k - ] % mod) % mod;
if(j >= ) f[op][j][k] = (f[op][j][k] + 1LL * k * (m - j + - k) % mod * f[op ^ ][j - ][k] % mod) % mod;
if(j >= ) f[op][j][k] = (f[op][j][k] + 1LL * C(k + ) * f[op ^ ][j - ][k + ] % mod) % mod;
}
}
rep(i, , m) rep(j, , m - i) ans = (ans + f[op][i][j]) % mod;
ans = (ans % mod + mod) % mod;
printf("%d\n", ans);
}

Luogu 2051[AHOI2009]中国象棋 - DP的更多相关文章

  1. luogu 2051 [AHOI2009]中国象棋

    luogu 2051 [AHOI2009]中国象棋 真是一道令人愉♂悦丧心并框的好题... 首先"没有一个炮可以攻击到另一个炮"有个充分条件就是没有三个炮在同一行或同一列.证明:显 ...

  2. Luogu P2051 [AHOI2009]中国象棋(dp)

    P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...

  3. 洛谷.2051.[AHOI2009]中国象棋(DP)

    题目链接 /* 每行每列不能超过2个棋子,求方案数 前面行对后面行的影响只有 放了0个.1个.2个 棋子的列数,与排列方式无关 所以设f[i][j][k]表示前i行,放了0个棋子的有j列,放了1个棋子 ...

  4. [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...

  5. [P2051 [AHOI2009]中国象棋] DP

    https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...

  6. Luogu P2051[AHOI2009]中国象棋【dp】By cellur925

    题目传送门 题目大意:给定一个$n*m$的棋盘,求放三个“炮”使它们不共行也不共列的方案数.($n,m$$<=100$) 这题主要是转移比较困难,因为情况比较多,所以需要冷静大胆细心地进行分情况 ...

  7. 洛谷P2051 [AHOI2009]中国象棋(dp)

    题面 luogu 题解 \(50pts:\)显然是\(3\)进制状压\(dp\) \(100pts:\) 一行一行地考虑 \(f[i][j][k]\)表示前\(i\)行,有\(j\)列放了一个,有\( ...

  8. P2051 [AHOI2009]中国象棋——DP(我是谁,我在哪,为什么)

    象棋,给你棋盘大小,然后放炮(炮的数量不限),不能让炮打到其他的炮,问方案数: 数据n,m<=200; 状态压缩似乎能做,但是我不会: 因为只要状态数,所以不必纠结每种状态的具体情况: 可以想出 ...

  9. luogu P2051 [AHOI2009]中国象棋

    统计方案,果断 dp 注意到合法方案即为每一行,每一列的棋子数不超过2 设\(f_{i,j,k}\)表示放到第\(i\)行,有\(j\)列可以放2个,有\(k\)列可以放1个的方案 然后就随便讨论一下 ...

随机推荐

  1. python基础学习Day14 内置函数 匿名函数

    一.内置函数里几个高频重要函数 (1)min\max函数的用法 以min函数的为例: min:返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值). l1 =[(,),(, ...

  2. php图片转base64

    /*读取问价家图片生澈哥哥js文件 */header("Access-Control-Allow-Origin: *");$i=0;$handle = opendir('./ima ...

  3. Excel批量修改文件

    [1]把下图片放在一个文件目录下面,如E:\SVM_Class\airplanes [2]点击“开始”→“运行”(或按快捷键win+R),在弹出框中输入“cmd”,进入dos操作界面.   [3]do ...

  4. (django1.10)访问url报错Forbidden (CSRF cookie not set.): xxx

    问题:页面访问时报错 Forbidden (CSRF cookie not set.): xxx     解决方法: 修改settings.py文件,注释掉 django.middleware.csr ...

  5. Nginx 到底可以做什么

    本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得,欢迎留言交流. Nginx能做什么 反向 ...

  6. UVM1

    1.UVM: p_sequencer 的使用 http://blog.csdn.net/tingtang13/article/details/46546395

  7. NumPy 从数值范围创建数组

    NumPy 从数值范围创建数组 这一章节我们将学习如何从数值范围创建数组. numpy.arange numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下: ...

  8. android 常用渐变背景绘制

    从上到下绘制如图所示 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android= ...

  9. 4. Median of Two Sorted Arrays (二分法;递归的结束条件)

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  10. HDU 3691 Nubulsa Expo(全局最小割)

    Problem DescriptionYou may not hear about Nubulsa, an island country on the Pacific Ocean. Nubulsa i ...