Bzoj 1081 [Ahoi2009] chess 中国象棋
bzoj 1081 [Ahoi2009] chess 中国象棋
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1801
状态比较难设,的确没想到.
不关心第几列出现是否出现了棋子的个数.而是看看上一行第几列出现了1或2个棋子
利用组合巧妙解决问题.
设\(f[i][j][k]\)表示第i行有j列有1个棋子.有k行有2个棋子.
那么为空的即为\(m - j - k\)
状态转移方程:
1.这一行什么都不放:
\(f[i][j][k] += f[i - 1][j][k]\)
2.这一行放一个 在空行上放
\(f[i][j][k] += f[i - 1][j - 1][k] * (m - (j - 1) - k);\)
3.这一行放一个 在有一个棋子放
\(f[i][j][k] += f[i - 1][j + 1][k - 1] * (j + 1);\)
4.这一行放两个 都在一个棋子上放
\(f[i][j][k] += f[i - 1][j + 2][k - 2] * C(j + 2,2);\)
5.这一行放两个 在没有棋子上面放
\(f[i][j][k] += f[i - 1][j - 2][k] * C(m - j - k + 2,2);\)
6.这一行一个棋子在一个棋子的列上放,一个棋子在没有棋子的列上方
\(f[i][j][k] += f[i - 1][j][k - 1] * j * (m - j - k + 1)\)
边界的话:当然是\(f[0][0][0] = 1\)啦
滚动一下数组非常快
/*
卡常记录 :
总耗时 : 111ms -> 86ms
最高用时 : 23ms -> 17ms
*/
#include <iostream>
#include <cstdio>
#define rep(i,x,p) for(register int i = x;i <= p;++ i)
#define sep(i,x,p) for(register int i = x;i >= p;-- i)
#define gc getchar()
#define pc putchar
const int maxN = 100 + 7;
const int mod = 9999973;
long long f[2][maxN][maxN];
int n,m;
inline int read() {
int x = 0,f = 1;char c = gc;
while(c < '0' || c > '9') {if(c == '-')f = -1;c = gc;}
while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = gc;}
return x * f;
}
inline int C(int n) {
return n * ( n - 1 ) / 2;
}
int main() {
f[0][0][0] = 1;
int n,m;
n = read();m = read();
rep(i,1,n) {
int x = i % 2,q = x ? 0 : 1;
rep(j , 0 , m) {
for(register int k = 0;k + j <= m;++ k) {
f[x][j][k] = f[q][j][k];
if(j >= 1) f[x][j][k] += f[q][j - 1][k] * (m - (j - 1) - k);
if(k >= 1) f[x][j][k] += f[q][j + 1][k - 1] * (j + 1);
if(k >= 2) f[x][j][k] += f[q][j + 2][k - 2] * C(j + 2);
if(j >= 2) f[x][j][k] += f[q][j - 2][k] * C(m - j - k + 2);
if(k >= 1) f[x][j][k] += f[q][j][k - 1] * j * (m - j - k + 1);
f[x][j][k] %= mod;
}
}
}
long long ans = 0,x = n % 2;
rep(j , 0 , m) {
for(register int k = 0;k + j <= m;++ k)
ans += f[x][j][k];
ans %= mod;
}
printf("%lld\n", ans);
return 0;
}
Bzoj 1081 [Ahoi2009] chess 中国象棋的更多相关文章
- BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )
dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...
- bzoj 1801: [Ahoi2009]chess 中国象棋
Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N, ...
- [BZOJ 1801] [Ahoi2009]chess 中国象棋 【DP】
题目链接:BZOJ - 1801 题目分析 对于50%的数据是可以直接状压 DP 的. 对于100%的数据,使用递推的 DP .(或者这只叫递推不叫 DP ?) 可以发现,每一行和每一列的棋子个数不能 ...
- BZOJ 1801: [Ahoi2009]chess 中国象棋 [DP 组合计数]
http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放 ...
- bzoj 1801: [Ahoi2009]chess 中国象棋【dp】
注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdi ...
- BZOJ_1801_[Ahoi2009]chess 中国象棋_DP
BZOJ_1801_[Ahoi2009]chess 中国象棋_DP Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像 ...
- 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP
[BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...
- BZOJ1801 Ahoi2009 chess 中国象棋 【DP+组合计数】*
BZOJ1801 Ahoi2009 chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行 ...
- BZOJ1801 [Ahoi2009]chess 中国象棋(DP, 计数)
题目链接 [Ahoi2009]chess 中国象棋 设$f[i][j][k]$为前i行,$j$列放了1个棋子,$k$列放了2个棋子的方案数 分6种情况讨论,依次状态转移. #include <b ...
随机推荐
- 原生JS轮播-各种效果的极简实现(二)面向对象版本的实现和优化
之前写了一篇原生JS轮播,不过是非面向对象的,并且也没有添加上自动轮播.这里来写一下如何优化和进阶. 这里简单地介绍一下之前的代码,这是html结构 <body> <div clas ...
- JS实现拖拽功能
本文代码地址(第一节):https://github.com/dirstart/js-exam/blob/master/%E6%8B%96%E6%8B%BDdiv1.html 第二节:https:// ...
- Luogu P2183 [国家集训队]礼物 扩展卢卡斯+组合数
好吧学长说是板子...学了之后才发现就是板子qwq 题意:求$ C_n^{w_1}*C_{n-w_1}^{w_2}*C_{n-w_1-w_2}^{w_3}*...\space mod \space P ...
- 我在B站学习 清华大学教授带你学习c++(进阶)类与对象
B站av11459203的一系列视频,跳过了基础篇直接进入进阶,从此难度开始加大.这里做出一些笔记分享一下. 我是1.25速度看的..对应分P 34-36 对象:现实中对象的模拟,具有属性和行为,对象 ...
- Windows下搭建QT环境
必须软件 qt-windows-opensource-5.1.1-msvc2010-x86-offline qt-vs-addin-1.2.2-opensource支持vs2008.2010.2012 ...
- 011 Container With Most Water 盛最多水的容器
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) .画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线,使得它们 ...
- SQL中改变列的数据类型
一.该列非主键.无default约束 直接更新: alter table 表名 alter column 列名 数据类型 二.该列为主键列.无default约束 (1)删除主键 alter table ...
- VS2015配置使用Sqlite以及EF6框架记录
项目中需要使用到Sqlite本地数据库保存数据,以防止离线情况下设备的正常使用. 一.下载vs2015下的sqlite插件,并安装 插件下载页面:http://system.data.sqlite.o ...
- json解析数组类型的数据
//微信里一个检测是否有发送模版消息的权限的方法//此处的openid代表的微信用户openid,templateId代表的是模版消息idpublic boolean checkIsSendTempM ...
- 菜鸟 学注册机编写之 “RSA”
测试环境 系统: xp sp3 调试器 :od 1.10 RSA简单介绍 选取两个别人不知道的大素数p, q. 公共模n = p*q 欧拉值φ(n) = (p-1)(q-1) 选取公匙(加密匙) e ...