[BZOJ 1801] Chess
Link:
Solution:
一眼看过去又像是状压$dp$的经典模型……
但此题$n,m\le 100$ ,直接跑状压只有50分
此时要发现这道题的特点:每行/列不能放置超过2个
既然每一列只可能有 不选/选1个/选2个 这三种状态,直接记录这三种状态的个数即可
于是设$dp[i][j][k]$为到第$i$行时,有$j$列放置了1个,有$k$列放置了2个的方案数
接下来分五种情况递推就行了
Code:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MAXN=,MOD=;
int n,m,cur;
ll dp[][MAXN][MAXN],res; ll C(int a)
{return 1ll*a*(a-)/;} int main()
{
scanf("%d%d",&n,&m); dp[cur^][][]=;
for(int i=;i<=n;i++,cur^=)
for(int j=;j<=m;j++) for(int k=;j+k<=m;k++)
{
dp[cur][j][k]=dp[cur^][j][k];
if(k>=) (dp[cur][j][k]+=dp[cur^][j+][k-]*(j+))%=MOD;
if(j>=) (dp[cur][j][k]+=dp[cur^][j-][k]*(m-j-k+))%=MOD;
if(j>=) (dp[cur][j][k]+=dp[cur^][j-][k]*C(m-j-k+))%=MOD;
if(k>=) (dp[cur][j][k]+=dp[cur^][j+][k-]*C(j+))%=MOD;
if(k>=) (dp[cur][j][k]+=dp[cur^][j][k-]*j*(m-j-k+))%=MOD;
}
for(int i=;i<=m;i++) for(int j=;i+j<=m;j++)
(res+=dp[cur^][i][j])%=MOD;
printf("%lld",res);
return ;
}
Reviews:
感觉现在想问题还是太定式了
更重要的是找到每道题的特点
对于总状态数较少的题目直接记录每种状态的个数$dp$即可,仅当状态数过多时状压
[BZOJ 1801] Chess的更多相关文章
- [BZOJ 1801] [Ahoi2009]chess 中国象棋 【DP】
题目链接:BZOJ - 1801 题目分析 对于50%的数据是可以直接状压 DP 的. 对于100%的数据,使用递推的 DP .(或者这只叫递推不叫 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 中国象棋
Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N, ...
- bzoj 1801: [Ahoi2009]chess 中国象棋【dp】
注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdi ...
- BZOJ 1801中国象棋 DP
1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1426 Solved: 826[Submit][ ...
- BZOJ 1801 AHOI2009 中国象棋 递归
标题效果:给定一个棋盘.放置一些枪.它需要随机两支枪不能互相攻击,评估的数目p模值 首先,两炮不攻击对方自由地等同于一条线最多可有只有两个枪 直形压力DP话是50分 考虑到每个列是等效 然后我们就可以 ...
- DP【p2051(bzoj 1801)】 [AHOI2009]中国象棋.
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- JZOJ 1667 ( bzoj 1801 ) [ AHOI 2009 ] 中国象棋 —— DP
题目:https://jzoj.net/senior/#main/show/1667 首先,一行.一列最多只有 2 个炮: 所以记录一下之前有多少行有 0/1/2 个炮,转移即可: 注意取模!小心在某 ...
随机推荐
- ng的ngModel用来处理表单操作
https://segmentfault.com/a/1190000009126012
- Phantomjs设置浏览器useragent的方式
Selenium中使用PhantomJS,设置User-Agent的方法. 默认情况下,是没有自动设置User-Agent的:设置PhantomJS的user-agent def __init__(s ...
- js和jquery修改背景颜色的区别
html: <HTML> <head> <meta http-equiv="content-type" content="text/html ...
- 【转载】惊天大悲剧-Hadoop的rmr和trash
转自:http://java-doom.iteye.com/blog/1898000 这两天在操作Hadoop集群时,由于一个误操作,制作了一个天大的悲剧 不小心把Hadoop集群上的所有文件全部删除 ...
- BZOJ1037 DP
2013-11-15 21:51 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1037 拿到这道题想到了DP,后来发现三维无法确定的表示状 ...
- Kali Linux中前十名的Wifi攻击工具
无 线网络的攻与防一直是比较热门的话题,由于无线信号可以被一定范围内的任何人接收到(包括死黑阔),这样就给WIFI带来了安全隐患:路由器生产厂商和网 络服务供应商(ISPs)的配置大多是默认开启了WP ...
- 在生成的Debug中test.exe的同级目录下创建一个文件,如TestLog.log
在上次编写一个日志类库时,想在.exe的同级目录下创建.log文件,对于这个路径的获得很简单,调用GetModuleFileName()函数即可.但是要去掉.exe而换成.log时,由于对字符串处理不 ...
- 用java实现word转html
由于项目需要,要完成将上传的word文件转成html文件的功能.在网上搜了一下,大致有3种方法:1.用jacob实现 2.用poi实现 3.用openoffice实现. 从网上来看好像jacob用的人 ...
- C# 正则表达式判断IP,URL等及其解释
C# 正则表达式判断IP,URL等及其解释 判断IP格式方法: public static bool ValidateIPAddress(string ipAddress) { Regex valid ...
- WCF发布方式介绍
转载出处:http://blog.csdn.net/fangxing80/article/details/6101790 从VS2005推出WCF以来,WCF逐步取代了Remoting, WebSer ...