[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 个炮,转移即可: 注意取模!小心在某 ...
随机推荐
- npm错误总结
You cannot publish over the previously published version 1.0.1." : xxx 发布时一定要修改package.json的版本号 ...
- POJ2516:Minimum Cost(最小费用最大流)
Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19088 Accepted: 6740 题目链 ...
- poj1185 炮兵阵地 状压dp
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示) ...
- ansible 部署jdk
playbook 剧本如下 [root@sz_fy_virt_encrypt_33_239 x]# cat jdk.yml - hosts: web remote_user: opsadmin bec ...
- mycat 管理MySQL5.7主从搭建
1.首先安装MySQL ab: 192.168.6.163 master 192.168.6.167 slave master: vi /etc/opt/rh/rh-mysql57/my.cnf.d/ ...
- C语言编译各过程
1.预处理 此阶段主要完成#符号后面的各项内容到源文件的替换,往往一些莫名其妙的错误都是出现在头文件中的,要在工程中注意积累一些错误知识. (1).#ifdef等内容,完成条件编译内容的替换 (2). ...
- nginx重启失败
参考: http://www.bubuko.com/infodetail-1742262.html Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8 ...
- 如何完全禁用或卸载Windows 10中的OneDrive
该功能占用很大的内存与CPU 详见http://os.51cto.com/art/201508/489371.htm
- CentOS erlang安装
1. http://www.erlang.org/下载erlang,解压缩,进入目录,检查环境 alex$ cd otp_src_18. alex$ ./configure ************* ...
- UVALIVE 3891 The Teacher's Side of Math
One of the tasks students routinely carry out in their mathematics classes is to solve a polynomial ...