Luogu 2051[AHOI2009]中国象棋 - DP
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的更多相关文章
- luogu 2051 [AHOI2009]中国象棋
		
luogu 2051 [AHOI2009]中国象棋 真是一道令人愉♂悦丧心并框的好题... 首先"没有一个炮可以攻击到另一个炮"有个充分条件就是没有三个炮在同一行或同一列.证明:显 ...
 - Luogu P2051 [AHOI2009]中国象棋(dp)
		
P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...
 - 洛谷.2051.[AHOI2009]中国象棋(DP)
		
题目链接 /* 每行每列不能超过2个棋子,求方案数 前面行对后面行的影响只有 放了0个.1个.2个 棋子的列数,与排列方式无关 所以设f[i][j][k]表示前i行,放了0个棋子的有j列,放了1个棋子 ...
 - [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)
		
题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...
 - [P2051 [AHOI2009]中国象棋] DP
		
https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...
 - Luogu P2051[AHOI2009]中国象棋【dp】By cellur925
		
题目传送门 题目大意:给定一个$n*m$的棋盘,求放三个“炮”使它们不共行也不共列的方案数.($n,m$$<=100$) 这题主要是转移比较困难,因为情况比较多,所以需要冷静大胆细心地进行分情况 ...
 - 洛谷P2051 [AHOI2009]中国象棋(dp)
		
题面 luogu 题解 \(50pts:\)显然是\(3\)进制状压\(dp\) \(100pts:\) 一行一行地考虑 \(f[i][j][k]\)表示前\(i\)行,有\(j\)列放了一个,有\( ...
 - P2051 [AHOI2009]中国象棋——DP(我是谁,我在哪,为什么)
		
象棋,给你棋盘大小,然后放炮(炮的数量不限),不能让炮打到其他的炮,问方案数: 数据n,m<=200; 状态压缩似乎能做,但是我不会: 因为只要状态数,所以不必纠结每种状态的具体情况: 可以想出 ...
 - luogu P2051 [AHOI2009]中国象棋
		
统计方案,果断 dp 注意到合法方案即为每一行,每一列的棋子数不超过2 设\(f_{i,j,k}\)表示放到第\(i\)行,有\(j\)列可以放2个,有\(k\)列可以放1个的方案 然后就随便讨论一下 ...
 
随机推荐
- 构建BSP (boardsupport packet)
			
由于移植期间遇到较多头文件包含及常量定义问题,故在此总结如下: 常量定义一般涉及到寄存器定义.寄存器配置常量定义,寄存器配置常量一般在驱动目录下自定义,所以如果编译过程中出现常量未定义的情况一般是属于 ...
 - surf特征点检测
			
※注:参数SURF中的hessian阈值是图像Hessian矩阵判别式的阈值,值越大检测出的特征点就越少,也就意味着特征点越稳定 #include "opencv2/core/core.hp ...
 - RepeatMasker
			
1.简介 RepeatMasker是一款基于Library-based,通过相似性比对来识别重复序列,可以屏蔽序列中转座子重复序列和低复杂度序列(默认将其替换成N).提供有在线服务.RepeatMas ...
 - Java将一个字符串的首位改为大写后边改为小写的实现,String
			
Java将一个字符串的首位改为大写后边改为小写的实现,String 思路: 获取首字母, charAt(0) substring(0,1) 转成大写 toUpperCase() 转大写hellO=== ...
 - js中函数的 this、arguments 、caller,call(),apply(),bind()
			
在函数内部有两个特殊的对象,arguments 和 this,还有一个函数对象的属性caller. arguments对象 arguments是一个类似数组的对象,包含着传入函数的所有参数. func ...
 - 简单的jQ代码
			
简单的jQ代码 /* * Lazy Load - jQuery plugin for lazy loading images * * Copyright (c) 2007-2012 Mika Tuup ...
 - php 两个值进行比较的问题
			
php手册运算符中有介绍: 比较多种类型-- 如var_dump([ ] > 0); // 结果为true 运算数 1 类型 运算数 2 类型 结果 null 或 string string 将 ...
 - robotium—只有apk文件的测试
			
把ppt的内容总结一下,并把问题说明一下: 把基本步骤搞出来,用notepad的程序吧,直接安装apk,就当做是不知道源码就好啦! 直接用自己的手机上就行啦!! 一.重签名: 步骤: 1.直接运行re ...
 - 【环境配置】本地配置sublime text以及和远程linux设置sftp
			
工具: sublime text 2(mac版) 远程linux(centos 7系) securCRT(for mac) [本地安装并配置securCRT(for mac)] 关于配置: 1.解决终 ...
 - java_12多态
			
1多态概述 多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样 ...