BZOJ1801: [Ahoi2009]chess 中国象棋

Description

在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧.

Input

一行包含两个整数N,M,中间用空格分开.

Output

输出所有的方案数,由于值比较大,输出其mod 9999973

Sample Input

1 3

Sample Output

7

HINT

除了在3个格子中都放满炮的的情况外,其它的都可以.

100%的数据中N,M不超过100
50%的数据中,N,M至少有一个数不超过8
30%的数据中,N,M均不超过6


题解Here!

一眼看去——棋盘$DP$。
首先,每行、每列最多放俩炮,这个不用多说。
对于$50%$的数据,直接状压$DP$对吧。
然后我们发现,我们对于棋子的顺序与位置并不关心。
也就是说,并不需要知道准确的状态。
那么我们就可以把状态压缩省去了,换成讲的状态记录。
设$dp[i][j][k]$表示当前正在填第$i+1$行,前$i$行中有$j$列放了一个棋子,有$k$列放了两个棋子。
然后转移就是分类讨论,运用加法原理和乘法原理即可,具体可以参见代码。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 110
#define MOD 9999973
using namespace std;
int n,m;
long long ans=0,dp[MAXN][MAXN][MAXN];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline int C(int x){return x*(x-1)/2;}
void solve(){dp[0][0][0]=1;for(int i=0;i<n;i++)for(int j=0;j<=m;j++)for(int k=0;j+k<=m;k++)if(dp[i][j][k]){dp[i+1][j][k]=(dp[i+1][j][k]+dp[i][j][k])%MOD;//一个棋子都不放if(m-k-j>=1)//放一个,在没有棋子的那一列dp[i+1][j+1][k]=(dp[i+1][j+1][k]+dp[i][j][k]*(m-j-k)%MOD)%MOD;if(j>=1)//放一个,在有一个棋子的那一列dp[i+1][j-1][k+1]=(dp[i+1][j-1][k+1]+dp[i][j][k]*j%MOD)%MOD;if(m-k-j>=1&&j>=1)//放两个,一个在没有棋子的列,一个在有一个棋子的列dp[i+1][j][k+1]=(dp[i+1][j][k+1]+dp[i][j][k]*(m-j-k)%MOD*j%MOD)%MOD;if(m-k-j>=2)//放两个,都在没有棋子的两列dp[i+1][j+2][k]=(dp[i+1][j+2][k]+dp[i][j][k]*C(m-j-k)%MOD)%MOD;if(j>=2)//两个,在一个棋子的列dp[i+1][j-2][k+2]=(dp[i+1][j-2][k+2]+dp[i][j][k]*C(j)%MOD)%MOD;}
}
void work(){n=read();m=read();solve();for(int i=0;i<=m;i++)for(int j=0;i+j<=m;j++)ans=(ans+dp[n][i][j])%MOD;//统计方案数printf("%lld\n",ans);
}
int main(){work();return 0;
}

  

转载于:https://www.cnblogs.com/Yangrui-Blog/p/9862190.html

BZOJ1801: [Ahoi2009]chess 中国象棋相关推荐

  1. BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )

    dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...

  2. bzoj 1801: [Ahoi2009]chess 中国象棋 bzoj 4806: 炮

    1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1851  Solved: 1062 [Submi ...

  3. 【BZOJ1801】【DTOJ2004】 [Ahoi2009]chess 中国象棋 【DP】

    题解: 首先知道一个性质,每一行每一列都最多有两个炮 那么很显然是DP 设F[i][j][k]表示前i行,有j列有一个炮,有k列有两个炮,那么转移式子为 这一行什么都不做:f[i][j][k]=f[i ...

  4. bzoj 1801: [Ahoi2009]chess 中国象棋【dp】

    注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdi ...

  5. 2017.10.23 chess 中国象棋 思考记录

    这种题的一般解法: 1. 发现状压可以搞,然后发现状态爆炸 2.考虑状态特点,一共只有几种可能的状态 3.考虑可不可以只对状态进行计数 4.离散统计贡献 码: #include<iostream ...

  6. BZOJ 1801 chess 中国象棋

    题意: 在n * m 的棋盘上放"炮",使得任意两个炮都不会互相攻击,求方案数. 题解: 既然是求方案数,那么考虑数学方法和递推,这一道题的限制条件比较麻烦,数学方法不合适,考虑递 ...

  7. JZOJ 1667【AHOI2009】中国象棋——dp

    题目:https://jzoj.net/senior/#main/show/1667 只注重0.1.2的列有多少个,不注重它们的位置,就能记录了. #include<iostream> # ...

  8. [AHOI 2009]chess 中国象棋

    Description 题库链接 给你一张 \(N\times M\) 的棋盘.要求每行每列最多放两个棋子,问总方案数. \(1\leq N,M\leq 100\) Solution 记 \(f_{i ...

  9. BZOJ 1801 AHOI 2009 chess 中国象棋 DP

    题目大意:给出棋盘的大小,问任意行和列放置的棋子都不超过两个有多少种方案. 思路:一个比较麻烦的DP.f[i][j][k]表示到前i行,放置了一个棋子的列为j,放置了两个棋子的列为k的方案数,然后有六 ...

最新文章

  1. linux进程间通信:system V 共享内存
  2. mysql 逗号 join_关于sql:MySQL中逗号分隔的连接和语法连接有什么区别?
  3. 贝塞尔曲线开发的艺术
  4. 使用pg_resetwal时空穿梭找回“幽灵”元组
  5. BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机)
  6. git push到GitHub的时候遇到! [rejected] master -> master (non-fast-forward)的问题
  7. Flowable通过api查询流程返回流程图节点
  8. 预处理和typedef
  9. opencv 训练人脸对比_Page21-树莓派4B人脸检测与识别(opencv)
  10. leecode - 入门 -- 双指针秒杀数组/链表题目
  11. 手把手带你玩转Spark机器学习-使用Spark进行文本处理
  12. 微信小程序怎么开店?怎么开一个小程序店铺
  13. python画八卦图的指令_你会画先天八卦图吗?只要知道了每个卦的方位,画起来其实很简单...
  14. 快捷键你到底知道多少(Pr篇)
  15. 静态IP、动态IP、ADSL拨号和DNS这几者你分得清吗?
  16. 说明书丨Epigentek EpiNext 高灵敏免疫共沉淀测序试剂盒
  17. 国内主要的量化交易平台
  18. 【ECCV2018 UPDT】Unveiling the Power of Deep Tracking[特征融合]
  19. 每周全球科技十大新闻(2019.7.14-7.21)
  20. Xshell连接服务器

热门文章

  1. Java设计模式——单件模式
  2. Jenkins之构建Maven项目的多种方式
  3. linux分配iomem,Linux中__iomem
  4. cmw500综合测试仪使用_综合布线中手持式测试仪
  5. 面向任务的 Git 学习法
  6. Android Studio 中文显示方块□□问题解决
  7. android项目允许命令,android 项目 gradle 命令
  8. 重磅!华为HCIE将于2021年5月30日改版,取消面试考试
  9. 鉴机识变,面向未来|RocketMQ Summit 2022 即将来袭
  10. 阿里云重磅发布云原生裸金属方案 | 云原生生态周报 Vol. 53