洛谷P2051 [AHOI2009]中国象棋(dp)
题面
题解
\(50pts:\)显然是\(3\)进制状压\(dp\)
\(100pts:\)
一行一行地考虑
\(f[i][j][k]\)表示前\(i\)行,有\(j\)列放了一个,有\(k\)列放了两个的方案数
转移很显然
Code
#include<bits/stdc++.h>
#define LL long long
#define RG register
using namespace std;
template<class T> inline void read(T &x) {
	x = 0; RG char c = getchar(); bool f = 0;
	while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
	while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
	x = f ? -x : x;
	return ;
}
template<class T> inline void write(T x) {
	if (!x) {putchar(48);return ;}
	if (x < 0) x = -x, putchar('-');
	int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
	for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
}
const int N = 110, Mod = 9999973;
int n, m;
int f[N][N][N];
void pls(int &x, LL y) {
	y %= Mod;
	x += y;
	if (x >= Mod) x -= Mod;
}
int C(int x) {//C(x, 2)
	return x * (x - 1) / 2;
}
int main() {
	read(n), read(m);
	f[0][0][0] = 1;
	for (int i = 0; i < n; i++)//主动转移
		for (int j = 0; j <= m; j++)
			for (int k = 0; k + j <= m; k++)
				if (f[i][j][k]) {
					pls(f[i + 1][j][k], f[i][j][k]);
					if (m - k - j) pls(f[i + 1][j + 1][k], 1ll * f[i][j][k] * (m - k - j));
					if (j) pls(f[i + 1][j - 1][k + 1], 1ll * f[i][j][k] * j);
					if (m - k - j > 1) pls(f[i + 1][j + 2][k], 1ll * f[i][j][k] * C(m - k - j));
					if (j > 1) pls(f[i + 1][j - 2][k + 2], 1ll * f[i][j][k] * C(j));
					if (m - k - j && j) pls(f[i + 1][j][k + 1], 1ll * f[i][j][k] * j * (m - k - j));
				}
	int ans = 0;
	for (int j = 0; j <= m; j++)
		for (int k = 0; k + j <= m; k++)
			pls(ans, f[n][j][k]);
	printf("%d\n", ans);
	return 0;
}
洛谷P2051 [AHOI2009]中国象棋(dp)的更多相关文章
- 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP
		P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ... 
- 洛谷  P2051 [AHOI2009]中国象棋 解题报告
		P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ... 
- [洛谷P2051] [AHOI2009]中国象棋
		洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ... 
- 洛谷 P2051 [AHOI2009]中国象棋
		题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ... 
- 洛谷P2051 [AHOI2009] 中国象棋(状压dp)
		题目简介 n*m的棋盘,对每行放炮,要求每行每列炮数<=2,求方案数%9999973 N,M<=100 题目分析 算法考虑 考虑到N,M范围较小,每一行状态只与前面的行状态有关,考虑状压D ... 
- 洛谷.2051.[AHOI2009]中国象棋(DP)
		题目链接 /* 每行每列不能超过2个棋子,求方案数 前面行对后面行的影响只有 放了0个.1个.2个 棋子的列数,与排列方式无关 所以设f[i][j][k]表示前i行,放了0个棋子的有j列,放了1个棋子 ... 
- Luogu P2051 [AHOI2009]中国象棋(dp)
		P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ... 
- [P2051 [AHOI2009]中国象棋] DP
		https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ... 
- BZOJ1801或洛谷2051 [AHOI2009]中国象棋
		BZOJ原题链接 洛谷原题链接 这题挺难想状态的,刚看题感觉是状压,但数据\(100\)显然不可能. 注意到每行每列只能放\(0\sim 2\)个棋子,所以我们可以将这个写入状态. 设\(f[i][j ... 
随机推荐
- [Training Video - 1] [Selenium Basics] [What is Selenium IDE,RC,Webdriver, TestNG, Junit And Ant]
			Selenium IDE (Only support in Firefox): - Record and Run - UI interface - User extensions - Conversi ... 
- jvm编译环境搭建 win Vc篇
			/************************************************************** 技术博客 http://www.cnblogs.com/itdef/ ... 
- 简述json模块
			JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,他的数据结构与Python中的字典一样,键值对来表示数据间的关系,可以包含列表. 在编写 ... 
- JQuery中button提交表单报TypeError: elem[type] is not a function jquery
			错误: TypeError: elem[type] is not a function jquery 解决: 出现这种现象的原因是,提交的表单中,有标签的name,有以submit命名的 name中不 ... 
- Linux 基础教程 37-进程命令
			pidof 我们知道每个小孩一出生就会一个全国唯一的编号来对其进行标识,用于以后上学,办社保等,就是我们的身份证号.那么在Linux系统中,用来管理运行程序的标识叫做PID,就是大家熟知的进程 ... 
- Ubuntu下的apache2的配置过程
			参考apache2的中文文档:http://httpd.apache.org/docs/2.4/ 安装apache2: apt-get install apache2 安装apache2doc文档:a ... 
- Python + selenium + unittest装饰器 @classmethod
			前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ... 
- 洛谷P1486 [NOI2004]郁闷的出纳员(splay)
			题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ... 
- [label][转载][JavaSript]querySelectorAll 方法相比 getElementsBy 系列方法有什么区别?
			轉載出處: http://www.zhihu.com/question/24702250 querySelectorAll 相比下面这些方法有什么区别? getElementsByTagName g ... 
- Python学习-12.Python的输入输出
			在Python中,输出使用print函数,之前用过了. 输入的话,则使用input函数. var = input() print('you input is' + var) 输入haha则将输出you ... 
