codeforces 277.5 div2 F:组合计数类dp
题目大意:
求一个 n*n的 (0,1)矩阵,每行每列都只有两个1 的方案数
且该矩阵的前m行已知
分析:
这个题跟牡丹江区域赛的D题有些类似,都是有关矩阵的行列的覆盖问题
牡丹江D是求概率,这个题是方案数,也比较相似。。
这种题中,因为只要求方案数。。我们只要关注几行几列有几个1,而不必要关注具体的位置
题解:
行列都需要处理,因此考虑记录列的状态,然后一行一行的转移
最暴力的方程:
dp[i][j][k][t] 表示已经确定了 i 行 有 j列已经有两个1,有k列只有一个1,有t列一个1也没有的方案数
很显然 第i+1行的两个1 只能放在k列中 或者 t列中
状态转移方程乘上组合数也是很好写的
但是这个方程显然过于暴力。。需要优化
首先,显然 j+k+t=n 因此 t 就不用枚举了
方程变为n3,由于cf服务器很强大,已经可以过了。。
然后又发现 ,前 i 行 应该有且只有 2i 个1 ,所以显然 k=2* i - j
k也不用枚举了。。
最终得到一个二维的dp
代码如下:
#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define MAXN 10000
int n,m,mod;
int dp[][];
char s[];
int num[];
void ini()
{
memset(num,,sizeof(num));
//memset(dp,0,sizeof(dp));
for(int i=;i<=m;i++)
{
scanf("%s",s);
for(int i=;i<n;i++)
{
num[i]+=s[i]-'';
}
}
int j=;
for(int i=;i<n;i++)
{
if(num[i]==)
j++;
}
dp[m%][j]=;
}
void solve()
{
for(int i=m+;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(!dp[(i-)%][j])
continue;
int k=*(i-)-*j;
int t=n-j-k;
if(k<)
break;
if(j<=n-&&k>=)
{
dp[i%][j+]+=(long long)dp[(i-)%][j]*k*(k-)/%mod;
dp[i%][j+]%=mod;
}
if(t>=)
{
dp[i%][j]+=(long long)dp[(i-)%][j]*(t)*(t-)/%mod;
dp[i%][j]%=mod;
}
if(t&&k)
{
dp[i%][j+]+=(long long)dp[(i-)%][j]*(t)*k%mod;
dp[i%][j+]%=mod;
}
dp[(i-)%][j]=;
}
}
printf("%d\n",dp[n%][n]);
}
int main()
{
while(scanf("%d%d%d",&n,&m,&mod)!=EOF)
{
ini();
solve();
}
return ;
}
codeforces 277.5 div2 F:组合计数类dp的更多相关文章
- Codeforces 9D How many trees? 【计数类DP】
Codeforces 9D How many trees? LINK 题目大意就是给你一个n和一个h 问你有多少个n个节点高度不小于h的二叉树 n和h的范围都很小 感觉有无限可能 考虑一下一个很显然的 ...
- [总结]数论和组合计数类数学相关(定理&证明&板子)
0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...
- 动态规划——区间DP,计数类DP,数位统计DP
本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...
- SDOI2010代码拍卖会 (计数类DP)
P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...
- CH5E26 扑克牌 (计数类DP)
$ CH~5E26~\times ~ $ 扑克牌: (计数类DP) $ solution: $ 唉,计数类DP总是这么有套路,就是想不到. 这道题我们首先可以发现牌的花色没有价值,只需要知道每种牌有 ...
- $Poj1737\ Connected\ Graph$ 计数类$DP$
AcWing Description 求$N$个节点的无向连通图有多少个,节点有标号,编号为$1~N$. $1<=N<=50$ Sol 在计数类$DP$中,通常要把一个问题划分成若干个子问 ...
- $CF559C\ Gerald\ and\ Fiant\ Chess$ 计数类$DP$
AcWing Description 有个$H$行$W$列的棋盘,里面有$N$个黑色格子,求一个棋子由左上方格子走到右下方格子且不经过黑色格子的方案数. $1<=H,M<=1e5,1< ...
- [自用]数论和组合计数类数学相关(定理&证明&板子)
0 写在前面 本文受 NaVi_Awson 的启发,甚至一些地方直接引用,在此说明. 1 数论 1.0 gcd 1.0.0 gcd $gcd(a,b) = gcd(b,a\;mod\;b)$ 证明:设 ...
- Codeforces 28C Bath Queue 【计数类DP】*
Codeforces 28C Bath Queue LINK 简要题意:有 n 个人等概率随机进入 m 个房间,一个房间可以有多个人,第 i 个房间有 ai 个水龙头,在一个房间的人要去排队装水,他们 ...
随机推荐
- Zend Studio 10正式版破解(2013-02-26更新)
Zend Studio 10正式版注册破解(2013-02-26完成更新) 1.以下方法仅供技术交流学习,请勿非法使用,如长期使用请支持购买正版. 2.若你还没有最新安装程序? ZendStudio ...
- linux下清理系统垃圾
可以使用以下命令清理系统垃圾sudo apt-get autoclean 清理旧版本的软件缓存sudo apt-get clean 清理所有软件缓存sudo apt-get autoremove 删除 ...
- hdu1074 Doing Homework(状态压缩DP Y=Y)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- JDK动态代理实现原理--转载
之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白了. ...
- Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易, ...
- 自定义控件 TextView 歌词 Lrc
演示 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> < ...
- Windows系统创建硬链接文件
源文件夹:E:\深海 创建新硬链接文件夹:D:\微云同步盘\719179409\4-工作资料\深海 打开命令提示符(管理员) 敲入以下命令: 创建成功后,进入目录 D:\微云同步盘\71917 ...
- ASP.NET 文本编辑器使用(CKEditor)与上传图片
CKEditor是什么 CKEidtor是一个在线富文本编辑器,可以将让用户所见即所得的获得编辑在线文本,编辑器或自动将用户编辑的文字格式转换成html代码. 方法一.在ASP.NET工程中添加CKE ...
- String分割类
StringTokenizer类 用的时候要 import java.util.StringTokenizer; StringTokenizer b=new StringTokenizer( Stri ...
- 向Dialog中添加一个新的Menu
1.创建一个新的Menu,在资源管理视图中,右键Menu-->传入Menu 2.设计新Menu,ID为IDR_MENU1 3.在该Dialog的源文件中,找到CTest001Dlg::OnIni ...