题目大意:

求一个 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. Opencv学习笔记(六)SURF学习笔记

    原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7392345 本人挺菜的,肯定有非常多错误纰漏之处 ,希望大家不吝指正. ...

  2. PHP 将Base64图片保存到 Sae storage

    <?php $file_dir='tu/'.date("Y/m/d").'/'; $fileName=create_guid(); $storage = new SaeSto ...

  3. SQL 结构化查询语言手册

    摘自该学习网站: http://www.w3school.com.cn/sql/ 新学到的几点: and 和or 连用,记得用括号.                2.SQL通配符补充   例如:   ...

  4. web03--session

    1.创建session1.jsp <body> <form action="session2.jsp" method="post"> & ...

  5. Windows离线安装.NET3.X

    Windows离线安装.NET3.X 当我们在Windows上安装软件的时候,总是会提示需要安装.NET3.X.而大多数人们选择在线安装,这样会很慢,不少人想到了离线安装的方式.其是只要你的电脑是Wi ...

  6. sessionstorage,localstorage和cookie之间的区别

    sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据.有了本地数据,就可以避免数据在浏览器和服务器间不必 ...

  7. Android Activity间传值

    Android中不同的Activity之间的传值方式(Main为当前Activity,Login为目标Activity) 1.使用Intent Intent intent = new Intent(M ...

  8. vs连接mysql

    1.打开vs2012在aspx中添加一个Grid view 控件,,. 2,选择新建数据源. 3,选择数据库. 4,选择新建连接. 5,更改成mysql连接. 6,这里的Server name 是你自 ...

  9. linux的sudo apt-get install 和dpkg -i <package.deb>命令

    ubuntu统一的安装软件命令 sudo apt-get install ** sudo dpkg -i <package.deb>

  10. Android开发环境搭建简介

    Android的开发工具,可以使用Eclipse,Idea,Android Studio,其中Eclipse是开源中国大部分使用的IDE,Idea是号称最好用的开发工具,有很多用处,Android S ...