【BZOJ】1801 [Ahoi2009]chess 中国象棋(dp)
题目
传送门:QWQ
分析
发现我们关心的不是棋子的位置,我们只关心棋子数量就ok。
首先每行每列最多两个棋子。这是显然的。
然后我觉得本题最难的部分就是对行进行讨论,蒟蒻我一直被限制在了对格点讨论。。。。
$dp[i][j][k] $放了前$i$行,有$j$列有1个棋子,有$k$列有2个棋子。转移就很显然了。
代码
#include <bits/stdc++.h>
typedef long long ll;
const int maxn=;const ll MOD=; ll dp[maxn][maxn][maxn];
//dp[i][j][k] 放了前i行,有j列有1个棋子,有k列有2个棋子
ll num(int x){return ll(x)*ll(x-)/;}
using namespace std;
int main(){
int n,m;scanf("%d%d",&n,&m);
dp[][][]=;
for(int i=;i<n;i++){ //放第i+1行
for(int j=;j<=m;j++){
for(int k=;k+j<=m;k++){
dp[i+][j][k]=(dp[i+][j][k]+dp[i][j][k])%MOD;
if(m-j-k>=) dp[i+][j+][k]=(dp[i+][j+][k]+dp[i][j][k]*(m-j-k))%MOD;
if(j>=) dp[i+][j-][k+]=(dp[i+][j-][k+]+dp[i][j][k]*j)%MOD;
if(m-j-k>=) dp[i+][j+][k]=(dp[i+][j+][k]+dp[i][j][k]*num(m-j-k))%MOD;
if(j>=) dp[i+][j-][k+]=(dp[i+][j-][k+]+dp[i][j][k]*num(j))%MOD;
if(m-j-k>= && j>=) dp[i+][j][k+]=(dp[i+][j][k+]+dp[i][j][k]*(m-j-k)*j)%MOD;
}
}
}
ll ans=;
for(int i=;i<=m;i++)
for(int j=;j+i<=m;j++)
ans=(ans+dp[n][i][j])%MOD;
printf("%lld\n",ans);
return ;
}
【BZOJ】1801 [Ahoi2009]chess 中国象棋(dp)的更多相关文章
- BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )
dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...
- BZOJ 1801: [Ahoi2009]chess 中国象棋 [DP 组合计数]
http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放 ...
- [BZOJ 1801] [Ahoi2009]chess 中国象棋 【DP】
题目链接:BZOJ - 1801 题目分析 对于50%的数据是可以直接状压 DP 的. 对于100%的数据,使用递推的 DP .(或者这只叫递推不叫 DP ?) 可以发现,每一行和每一列的棋子个数不能 ...
- bzoj 1801: [Ahoi2009]chess 中国象棋【dp】
注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdi ...
- bzoj 1801: [Ahoi2009]chess 中国象棋
Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N, ...
- Bzoj 1081 [Ahoi2009] chess 中国象棋
bzoj 1081 [Ahoi2009] chess 中国象棋 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1801 状态比较难设,的确 ...
- 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP
[BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...
- BZOJ——T 1801: [Ahoi2009]chess 中国象棋
http://www.lydsy.com/JudgeOnline/problem.php?id=1801 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ...
- bzoj1801: [Ahoi2009]chess 中国象棋 dp
题意:在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 题解:dp[i][j][k]表示到了第i行,有j列 ...
随机推荐
- php 二维数组
<?php // 一个二维数组 $cars=array ( array(,), array(,), array(,) ); ?>
- 创建对象并生成结果的3个步骤-Chapter 3 P38
必须完成3个步骤才能创建对象并生成结果: 1 创建对象 namespace LanguageFeatures { public class Product { public int Product ...
- C#属性升级版--自动属性-chapter 3 P34-36
使用C#属性,能够通过将数据与它的设置和检索方法分离的方式公开类中的一段数据. 例如: namespace LanguageFeatures { public class Product { ...
- 移动web开发适配方案之Rem
移动端为什么要做适配 移动端相对PC端来说大部分浏览器内核都是基于Webkit的,所以大部分都支持CSS3的最新语法.但是由于手机的屏幕尺寸和分辨率都不太一样(尤其是安卓),所以不得不对不同分辨率的手 ...
- 转载-LVS的三种工作模式
来源地址:http://www.uml.org.cn/zjjs/201211124.asp 1.lvs简介 lvs是一个开源的软件,由毕业于国防科技大学的章文嵩博士于1998年5月创立 ...
- 分析公司shareaholic报告:Chrome浏览器使用量居首
社交分析公司Shareaholic周四发布研究报告称,今年9月份,Chrome浏览器的使用量已经跃居行业榜首. 根据Shareaholic的数据,Chrome今年9月的使用量超过了火狐.IE和Oper ...
- LRY_FX_Assist(辅助EA)
功能说明 辅助EA就是别的EA没有功能用这个EA来弥补,比如说风控设置(预付款.浮亏.加仓层数等达到多少进行操作),移动止损(包括隐藏移动止损),启动马丁加仓等.这个EA不能自己独立开单,只能辅助其它 ...
- Echart参数详解收藏
最全: https://www.cnblogs.com/Kqingniao/p/5833419.html 柱形图: https://blog.csdn.net/qq_36330228/article/ ...
- 第10课 C++中的动态内存分配
C++中的动态内存分配 C语言是通过库函数来完成动态内存分配的,而C++是通过关键字从语言层面支持的. C语言中的malloc是基于字节来进行内存申请的,C++中是基于类型来进行的. delete加上 ...
- Plus and Square Root
ZS the Coder is playing a game. There is a number displayed on the screen and there are two buttons, ...