BZOJ1801: [Ahoi2009]chess 中国象棋
BZOJ1801: [Ahoi2009]chess 中国象棋
Description
Input
Output
Sample Input
Sample Output
HINT
除了在3个格子中都放满炮的的情况外,其它的都可以.
100%的数据中N,M不超过100
50%的数据中,N,M至少有一个数不超过8
30%的数据中,N,M均不超过6
题解Here!
#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 中国象棋相关推荐
- BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )
dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...
- bzoj 1801: [Ahoi2009]chess 中国象棋 bzoj 4806: 炮
1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1851 Solved: 1062 [Submi ...
- 【BZOJ1801】【DTOJ2004】 [Ahoi2009]chess 中国象棋 【DP】
题解: 首先知道一个性质,每一行每一列都最多有两个炮 那么很显然是DP 设F[i][j][k]表示前i行,有j列有一个炮,有k列有两个炮,那么转移式子为 这一行什么都不做:f[i][j][k]=f[i ...
- bzoj 1801: [Ahoi2009]chess 中国象棋【dp】
注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdi ...
- 2017.10.23 chess 中国象棋 思考记录
这种题的一般解法: 1. 发现状压可以搞,然后发现状态爆炸 2.考虑状态特点,一共只有几种可能的状态 3.考虑可不可以只对状态进行计数 4.离散统计贡献 码: #include<iostream ...
- BZOJ 1801 chess 中国象棋
题意: 在n * m 的棋盘上放"炮",使得任意两个炮都不会互相攻击,求方案数. 题解: 既然是求方案数,那么考虑数学方法和递推,这一道题的限制条件比较麻烦,数学方法不合适,考虑递 ...
- JZOJ 1667【AHOI2009】中国象棋——dp
题目:https://jzoj.net/senior/#main/show/1667 只注重0.1.2的列有多少个,不注重它们的位置,就能记录了. #include<iostream> # ...
- [AHOI 2009]chess 中国象棋
Description 题库链接 给你一张 \(N\times M\) 的棋盘.要求每行每列最多放两个棋子,问总方案数. \(1\leq N,M\leq 100\) Solution 记 \(f_{i ...
- BZOJ 1801 AHOI 2009 chess 中国象棋 DP
题目大意:给出棋盘的大小,问任意行和列放置的棋子都不超过两个有多少种方案. 思路:一个比较麻烦的DP.f[i][j][k]表示到前i行,放置了一个棋子的列为j,放置了两个棋子的列为k的方案数,然后有六 ...
最新文章
- linux进程间通信:system V 共享内存
- mysql 逗号 join_关于sql:MySQL中逗号分隔的连接和语法连接有什么区别?
- 贝塞尔曲线开发的艺术
- 使用pg_resetwal时空穿梭找回“幽灵”元组
- BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机)
- git push到GitHub的时候遇到! [rejected] master -> master (non-fast-forward)的问题
- Flowable通过api查询流程返回流程图节点
- 预处理和typedef
- opencv 训练人脸对比_Page21-树莓派4B人脸检测与识别(opencv)
- leecode - 入门 -- 双指针秒杀数组/链表题目
- 手把手带你玩转Spark机器学习-使用Spark进行文本处理
- 微信小程序怎么开店?怎么开一个小程序店铺
- python画八卦图的指令_你会画先天八卦图吗?只要知道了每个卦的方位,画起来其实很简单...
- 快捷键你到底知道多少(Pr篇)
- 静态IP、动态IP、ADSL拨号和DNS这几者你分得清吗?
- 说明书丨Epigentek EpiNext 高灵敏免疫共沉淀测序试剂盒
- 国内主要的量化交易平台
- 【ECCV2018 UPDT】Unveiling the Power of Deep Tracking[特征融合]
- 每周全球科技十大新闻(2019.7.14-7.21)
- Xshell连接服务器
热门文章
- Java设计模式——单件模式
- Jenkins之构建Maven项目的多种方式
- linux分配iomem,Linux中__iomem
- cmw500综合测试仪使用_综合布线中手持式测试仪
- 面向任务的 Git 学习法
- Android Studio 中文显示方块□□问题解决
- android项目允许命令,android 项目 gradle 命令
- 重磅!华为HCIE将于2021年5月30日改版,取消面试考试
- 鉴机识变,面向未来|RocketMQ Summit 2022 即将来袭
- 阿里云重磅发布云原生裸金属方案 | 云原生生态周报 Vol. 53