51Nod1634 刚体图 动态规划 容斥原理 排列组合

原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1634.html

题目传送门 - 51Nod1634

题意

基准时间限制:1 秒 空间限制:131072 KB 分值: 640 难度:8级算法题

计算机科学中,图可以看做是点集和边集所组成的二元组。

通过给每个点设置一个平面坐标,图可以镶嵌在欧几里得平面中。

一个图被认为是刚体,如果该图无法只改变其中一部分的形状,而使得余下的部分的形状保持不变。

例如上图中的 (a) (b) (c) 都是刚体。

为了简化问题,我们现在只考虑  n × m 的格点图。

上图不是刚体,但是可以通过在对角线加入支撑的方式使得其变为刚体。

我们的问题是,对于 m × n 的个点图,有多少种添加支撑的方案可以使其变为刚体?

注意本题在每个小矩形中,我们至多只允许添加一个方向的对角线。
例如,对于 2 × 3 的格点图,一共有 448 种方案。

题解

  考虑到加一条斜着的边的作用是让一个格子的行和列垂直。

  我们需要让所有的行和列都互相垂直。于是,只要我们建一个二分图,行和列分居两侧,问题就被转化成了统计连通的二分图个数,其中,一条边有两种连接的方式。

  令 $dp_{i,j}$ 表示左边有 $i$ 个,右边有 $j$ 个节点 的连通二分图个数,于是我们需要补集转化一下,得到:

$$dp_{n,m}=3^{nm}\sum_{i=1}^{n}\sum_{j=0}^{m}[i\neq n\ {\rm OR}\ j\neq m] \binom{n-1}{i-1}\binom{m}{j}\cdot 3^{(n-i)(m-j)}dp_{i,j}$$

  这里略微的解释一下意义。我们枚举第一个节点所在的连通块的左右部分点的个数,然后剩余的边可以随意连,所以有一个 $3^{(n-i)(m-j)}$ 。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=15,mod=1e9+7;
int C[N][N],Pow3[N*N],dp[N][N];
int main(){
	for (int i=0;i<N;i++)
		C[i][0]=C[i][i]=1;
	for (int i=1;i<N;i++)
		for (int j=1;j<i;j++)
			C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
	Pow3[0]=1;
	for (int i=1;i<N*N;i++)
		Pow3[i]=3LL*Pow3[i-1]%mod;
	memset(dp,0,sizeof dp);
	dp[0][1]=dp[1][0]=1;
	for (int n=1;n<N;n++)
		for (int m=1;m<N;m++){
			dp[n][m]=Pow3[n*m];
			for (int i=1;i<=n;i++)
				for (int j=0;j<=m;j++)
					if (i!=n||j!=m)
						dp[n][m]=(-1LL*C[n-1][i-1]*C[m][j]%mod
								*Pow3[(n-i)*(m-j)]%mod*dp[i][j]%mod
									+dp[n][m])%mod;
			dp[n][m]=(dp[n][m]+mod)%mod;
		}
	int n,m;
	while (~scanf("%d%d",&n,&m))
		printf("%d\n",dp[n][m]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/zhouzhendong/p/51Nod1634.html

时间: 2024-11-08 15:08:45

51Nod1634 刚体图 动态规划 容斥原理 排列组合的相关文章

【BZOJ 3505】 [Cqoi2014]数三角形 容斥原理+排列组合+GCD

我们先把所有三角形用排列组合算出来,再把一行一列上的三点共线减去,然后我们只观察向右上的三点共线,向左上的乘二即可,我们发现我们如果枚举所有的两边点再乘中间点的个数(GCD),那么我们发现所有的两边点都会形成一个矩形对角线,而且他们的形状一定则贡献一定那么我们可以枚举形状来求贡献和. #include <cstdio> typedef long long LL; LL n,m,ans,N,M; LL GCD(LL x,LL y){ return x==0?y:GCD(y%x,x); } int

排列组合或容斥原理

题目链接:https://vjudge.net/contest/237052#problem/H Here we go! Let's define the diversity of a list of numbers to be the difference between the largest and smallest number in the list. For example, the diversity of the list (1, -1, 2, 7) = 7 - (-1) = 8

[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数.要保证每行每列的格子上的数最小值为1,有多少种方案 \(n \leq 250,k \leq 10^9\) 分析 这题有\(O(n^3)\)的dp做法,但个人感觉不如\(O(n^2 \log n)\)直接用数学方法求更好理解. 考虑容斥原理,枚举有\(i\)行最小值>1,有\(j\)行最小值>1,那

9.9递归和动态规划(五)——确定某字符串的所有排列组合

/** * 功能:确定某字符串的所有排列组合. */ 注意:不考虑重复字符.若考虑重复字符,只需在加入permulations时去掉重复的字符串即可. /** * 思路:元素由少到多,将新的元素塞进所有字符串中间的任意可能位置. * @param str * @return */ public static ArrayList<String> getPerms(String str){ if(str==null) return null; ArrayList<String> per

排列组合问题之圆形分布

1.问题1.1 团团坐有一张圆桌,坐了A,B,C,D四个人,已知,D在A的右边,C在D的对面,请问A,B,C,D,的坐次? 解答:这个问题相对简单,我们纸上画一画,就能画出他们的可能的位置了 但是,可能还有一种解,比如我们把A,B,C,D依次右转一个位,也是满足条件的,而且只要保持他们的相对位置不变,依次右转n个位都是问题的解,而且还有个有趣的事情,当他们转了一圈(即右转4个位)后,他们右回到原位了 2.圆形分布上面这个问题就是一种圆形分布,那么他和直线分布的区别在哪里呢?又有什么联系呢?上面文

【noi 2.6_9288】&amp;【hdu 1133】Buy the Ticket(DP / 排列组合 Catalan+高精度)

题意:有m个人有一张50元的纸币,n个人有一张100元的纸币.他们要在一个原始存金为0元的售票处买一张50元的票,问一共有几种方案数. 解法:(学习了他人的推导后~) 1.Catalan数的应用7的变形.(推荐阅读:http://www.cnblogs.com/chenhuan001/p/5157133.html).P.S.不知我之前自己推出的公式“C(n,m)*C(2*m,m)/(m+1)*P(n,n)*P(m,m)”是否是正确的. (1)在不考虑m人和n人本身组内的排列时,总方案数为C(m+

排列组合知识

1.在不全相异的n个物体中,其中有n1个物体是相同的,n2个物体是相同的,……nk个物体是相同的.全部物体的种类数为k,则这n个物体的全排列数为 n!/(n1!*n2!*……*nk!) 2.用n-1条边将n个顶点连接的图有n^(n-2)个. 3.圆周排列 从N个元素中取出R个元素形成圆周排列,排列数为A(N,R)/R; 同理,N个元素的圆周排列数为(N-1)!; 4.按字典序生成下一个排列组合 ①从后往前找第一个正序的尾下标i,pi>p(i-1),pi>p(i+1): ②找p(i-1)后面其大

高中数学排列组合

一.特殊元素和特殊位置优先策略 例1.由0,1,2,3,4,5可以组成多少个没有重复数字五位奇数. 解:由于末位和首位有特殊要求,应该优先安排,以免不合要求的元素占了这两个位置. 先排末位共有 然后排首位共有 最后排其它位置共有 由分步计数原理得 二.相邻元素捆绑策略 例2. 7人站成一排 ,其中甲乙相邻且丙丁相邻, 共有多少种不同的排法. 解:可先将甲乙两元素捆绑成整体并看成一个复合元素,同时丙丁也看成一个复合元素,再与其它元素进行排列,同时对相邻元素内部进行自排.由分步计数原理可得共有种不同

【程序员眼中的统计学(5)】排列组合:排序、排位、排

排列组合:排序.排位.排 作者 白宁超 2015年10月15日18:30:07 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理.首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集.诚然在传统学科中,其在以上学科发挥作用很大.然而随着科学技术的发展和机器智能的普及,统计学在机器智能中的作用越来越重要.本系列统计学的学习基于<深入浅出统计学>一书(偏向代码实现,需要读者有一定基础,可以参见后面PPT学习).正如(吴军)先生在<数学之美>一书中阐述的,基于统