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 个水龙头,在一个房间的人要去排队装水,他们 ...
随机推荐
- Java Performance Optimization Tools and Techniques for Turbocharged Apps--reference
Java Performance Optimization by: Pierre-Hugues Charbonneau reference:http://refcardz.dzone.com/refc ...
- linux下常用基本命令操作
#fdisk -l 查看硬盘信息 cat /proc/cpuinfo 查看CPU信息 free -m 查看内存信息 ethtool eth0 查看网卡信息 df -h 查看硬盘各分区可用空间大小 ca ...
- 进程ps、kill 、grep
linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有 ...
- 自定义控件 TextView 歌词 Lrc
演示 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> < ...
- codevs 3693 数三角形
/* n*m个点中选3个 再排除三点共线 共线分两类 1 在横线或者竖线上 m*C(n,3) n*C(m,3) 2 在对角线上 这个比较麻烦 以为对角线和矩阵是一一对应的 我们转化成求矩阵 并且保证有 ...
- java中保留几位小数
public class NumUtils { /** * 保留两位小数 * * @param d * @return */ public static String get2Wei(double d ...
- iOS 网络与多线程--3.异步Get方式的网络请求(非阻塞)
通过Get请求方式,异步获取网络数据,异步请求不会阻塞主线程(用户界面不会卡死),而会建立一个新的线程. 代码如下 ViewController.h文件 // // ViewController.h ...
- Swift - 41 - swift1.2新特性(2)
swift 和 OC 的桥接 //: Playground - noun: a place where people can play import UIKit var PI = "3.14 ...
- 武汉科技大学ACM :1006: 华科版C语言程序设计教程(第二版)习题7.15
Problem Description 输入n个字符串(n<=100),输出其中最长的串,如果有多个则取最先找到的那一个. Input 多组测试数据. 每组测试数据第一行包含一个整数n,表示一共 ...
- crtmpserver的架构简介
crtmpserver的架构简介 一.层 Layers . 机器层 Machine layer . 操作系统层 Operating System Layer This layer is compo ...