题目大意:

求一个 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的更多相关文章

  1. Codeforces 9D How many trees? 【计数类DP】

    Codeforces 9D How many trees? LINK 题目大意就是给你一个n和一个h 问你有多少个n个节点高度不小于h的二叉树 n和h的范围都很小 感觉有无限可能 考虑一下一个很显然的 ...

  2. [总结]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...

  3. 动态规划——区间DP,计数类DP,数位统计DP

    本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...

  4. SDOI2010代码拍卖会 (计数类DP)

    P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...

  5. CH5E26 扑克牌 (计数类DP)

    $ CH~5E26~\times ~ $ 扑克牌: (计数类DP) $ solution: $ 唉,计数类DP总是这么有套路,就是想不到. 这道题我们首先可以发现牌的花色没有价值,只需要知道每种牌有 ...

  6. $Poj1737\ Connected\ Graph$ 计数类$DP$

    AcWing Description 求$N$个节点的无向连通图有多少个,节点有标号,编号为$1~N$. $1<=N<=50$ Sol 在计数类$DP$中,通常要把一个问题划分成若干个子问 ...

  7. $CF559C\ Gerald\ and\ Fiant\ Chess$ 计数类$DP$

    AcWing Description 有个$H$行$W$列的棋盘,里面有$N$个黑色格子,求一个棋子由左上方格子走到右下方格子且不经过黑色格子的方案数. $1<=H,M<=1e5,1< ...

  8. [自用]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 本文受 NaVi_Awson 的启发,甚至一些地方直接引用,在此说明. 1 数论 1.0 gcd 1.0.0 gcd $gcd(a,b) = gcd(b,a\;mod\;b)$ 证明:设 ...

  9. Codeforces 28C Bath Queue 【计数类DP】*

    Codeforces 28C Bath Queue LINK 简要题意:有 n 个人等概率随机进入 m 个房间,一个房间可以有多个人,第 i 个房间有 ai 个水龙头,在一个房间的人要去排队装水,他们 ...

随机推荐

  1. python django model类型摘要

    V=models.CharField(max_length=None[, **options]) #varchar V=models.EmailField([max_length=75, **opti ...

  2. Android 自定义View (二) 进阶

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24300125 继续自定义View之旅,前面已经介绍过一个自定义View的基础的例 ...

  3. VS2008 动态库和静态库的生成和加载

    第一:动态库和静态库的生成: 1) 新建一个生成dll工程: 文件->新建->项目->Win32->Win32控制台应用程序 输入项目名称:dllTest ,项目路径:D:\V ...

  4. 01-资料管理器(Directory/DirectoryInfo操作文件夹类)

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Loa ...

  5. spring-data-solr官方学习文档介绍

    spring-data-solr文档介绍如下: 通过http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd(spring ...

  6. SpringBoot入门系列:第一篇 Hello World

    跟随SpringBoot的文档(http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-d ...

  7. GDI+基础(3)

    常用图形绘制 <%@ Page ContentType="image/gif" Language="C#" %> <!--ContentTyp ...

  8. 关于oracle dbms_job 定时执行的内容。

    一.设置初始化参数 job_queue_processessql> alter system set job_queue_processes=n;(n>0)job_queue_proces ...

  9. libthrift0.9.0解析(四)之TThreadPoolServer&ServerContext

    TThreadPoolServer直接继承自TServer,实现类serve和stop操作. 在serve中可以接受多个连接,每个连接单独开一个线程进行处理,在每个线程中,按顺序处理该线程所绑定连接的 ...

  10. 使用UILocalNotification给App添加本地消息通知

    使用过的代码,直接贴上 UILocalNotification *notification = [[UILocalNotification alloc] init]; if (notification ...