[AHOI2009]中国象棋 DP,递推,组合数
DP,递推,组合数
其实相当于就是一个递推推式子,然后要用到一点组合数的知识
一道很妙的题,因为不能互相攻击,所以任意行列不能有超过两个炮
首先令f[i][j][k]代表前i行,有j列为一个炮,有k列为两个炮的方案
那么有如下转移:
1,这行不放炮,add+=f[i-1][j][k];
2,放一个炮,并且放在没有炮的那列 add+=f[i-1][j-1][k] * (m - j - k + 1);,因为放了这个炮后,
一个炮的变多了,也就是上一行的j+1得到这一行的j,所以上一行的j就是j-1,
又因为有m - (j - 1) - k列没有炮的,所以有乘上m- j - k + 1种方案
3,放一个炮,并且放在原先有一个炮的那列,add+=f[i-1][j+1][k-1] * (j + 1);
放了这个炮后,一个炮的变少了一个,两个炮的变多了一个,所以还回去就是j+1,k-1,
又因为有j+1列一个炮的,所以有j+1种方案放置
4,放两个炮,都放在没有炮的列上面,add+=f[i-1][j-2][k] * (m - j - k + 2) * (m - j - k + 1) / 2;
那么放了炮后,一个炮的变多了2列,所以还回去是j-2,又因为有(m - j - k + 2)列空的,所以就是在这些里面选两个组合,所以组合数计算
5,放两个炮,分别放在有炮的和没有炮的,add+=f[i-1][j][k-1] * (m - j - k + 1) * j;
因为没有炮 --- > 1个炮 ---> j++
一个炮 ---> 2个炮 ---> j--,k++
相当于j没有变化,而k要还回去,所以是f[i-1][j][k-1]
又因为有(m - j - k + 1)列空的,j列一个炮的,所以相乘得到方案
6,放两个炮,都放在原来有炮的,add+=f[i-1][j+2][k-2] * (j + 2) * (j + 1) / 2;
放了炮后,j-=2,k+=2,所以还回去就是j+2,k-2,
又因为有j+2列一个炮,选两个组合,所以就是(j + 2) * (j + 1) / 2
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define mod 9999973
#define AC 110
#define LL long long
int n,m,ans;
LL f[AC][AC][AC];
void work()
{
scanf("%d%d",&n,&m);
f[][][]=;
for(R i=;i<=n;i++)//枚举行
for(R j=;j<=m;j++)//枚举一个炮有多少列
{
int all=m-j;//因为要保证j+k<=m
for(R k=;k<=all;k++)//枚举两个炮有多少列
{
LL add=;//用一个变量存增量,避免多次访问3维数组,也许可以加速?
add+=f[i-][j][k];
if(j) add+=f[i-][j-][k] * (m - j - k + );
if(k && j + <= m) add+=f[i-][j+][k-] * (j + );//有j+1列一个炮可以选
if(j - >= ) add+=f[i-][j-][k] * (m - j - k + ) * (m - j - k + ) / ;
if(k - >= ) add+=f[i-][j][k-] * (m - j - k + ) * j;
if(j + <= m && k - >= ) add+=f[i-][j+][k-] * (j + ) * (j + ) / ;
if(add > mod) add%=mod;
f[i][j][k]=add;
}
}
for(R j=;j<=m;j++)//枚举最后的情况是怎么样的
{
int all=m-j;
for(R k=;k<=all;k++)
ans=(ans + f[n][j][k])%mod;
}
printf("%d\n",ans);
} int main()
{
freopen("in.in","r",stdin);
work();
fclose(stdin);
return ;
}
[AHOI2009]中国象棋 DP,递推,组合数的更多相关文章
- [BZOJ1801][AHOI2009]中国象棋(递推)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1801 分析: 只会50的状态压缩…… 然后搜了下题解,发现是dp 首先易得每行每列至多 ...
- Luogu P2051 [AHOI2009]中国象棋(dp)
P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...
- [P2051 [AHOI2009]中国象棋] DP
https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...
- P2051 [AHOI2009]中国象棋——DP(我是谁,我在哪,为什么)
象棋,给你棋盘大小,然后放炮(炮的数量不限),不能让炮打到其他的炮,问方案数: 数据n,m<=200; 状态压缩似乎能做,但是我不会: 因为只要状态数,所以不必纠结每种状态的具体情况: 可以想出 ...
- Luogu 2051[AHOI2009]中国象棋 - DP
Description 在 $n * m$ 的格子上放若干个炮, 使得每个炮都不能攻击到其他炮 Solution 定义数组f[ i ][ j ][ k ] 表示到了第 i 行, 已经有2个炮的列数为 ...
- 洛谷P2051 [AHOI2009]中国象棋(dp)
题面 luogu 题解 \(50pts:\)显然是\(3\)进制状压\(dp\) \(100pts:\) 一行一行地考虑 \(f[i][j][k]\)表示前\(i\)行,有\(j\)列放了一个,有\( ...
- 洛谷.2051.[AHOI2009]中国象棋(DP)
题目链接 /* 每行每列不能超过2个棋子,求方案数 前面行对后面行的影响只有 放了0个.1个.2个 棋子的列数,与排列方式无关 所以设f[i][j][k]表示前i行,放了0个棋子的有j列,放了1个棋子 ...
- 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP
P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...
- [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)
题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...
随机推荐
- ogg的安装配置 配置双向同步(含DDL)
第一部分 先配置单向同步(含DDL) 一 源端安装GoldenGate 创建用户 创建目录 mkdir -p /opt/ogg chmod -R 777 /opt/ogg chown -R oracl ...
- 「日常训练」Watering Flowers(Codeforces Round #340 Div.2 C)
题意与分析 (CodeForces 617C) 题意是这样的:一个花圃中有若干花和两个喷泉,你可以调节水的压力使得两个喷泉各自分别以\(r_1\)和\(r_2\)为最远距离向外喷水.你需要调整\(r_ ...
- uvaoj1225Digit Counting(暴力)
Trung is bored with his mathematics homeworks. He takes a piece of chalk and starts writing a sequen ...
- centos下php环境安装redis
一.安装redis(仅可在服务器使用,尚不能通过浏览器访问) (1)首先下载redis:wget http://download.redis.io/releases/redis-4.0.9.tar.g ...
- iWebShop安装教程
要进行iWebShop测试,要先在本地电脑上安装iWebShop运行环境,之后再安装iWebShop程序,接下来我就一步步讲解,如何安装iWebShop程序. ##一.运行环境搭建 这里我推荐新手使用 ...
- List和Turple
List 格式:classmates = ['Michael', 'Bob', 'Tracy'] 读取list长度用:len(classmetes) 索引:索引正向从0开始,逆向从-1开始 在末尾增加 ...
- Python文件操作大全
Python 编程文件操作大全 文件打开模式 打开模式 执行操作 'r' 以只读方式打开文件(默认) 'w' 以写入的方式打开文件,会覆盖已存在的文件 'x' 如果文件已经存在,使用此模式打开将引 ...
- Python列表的深拷贝和浅拷贝
1. Python列表的拷贝 对于python里面如果想要进行列表的拷贝和复制,具体的操作语句如下: 1) 深拷贝: M=[A,b,a,c] N=M[:] 2) 浅拷贝: N=M 有人说可以直接将M赋 ...
- Unity Lighting - The Precompute Process 预计算过程(二)
The Precompute Process 预计算过程 In Unity, precomputed lighting is calculated in the background - eith ...
- 爬虫1.6-selenium+HeadlessChrome
目录 爬虫-selenium+HeadlessChrome 1. 浏览器处理步骤 2. headless-chrome初体验 3. 实战爬取淘宝镇.街道信息 爬虫-selenium+HeadlessC ...