zoukankan      html  css  js  c++  java
  • 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 eq n { m OR} j eq m] inom{n-1}{i-1}inom{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
    ",dp[n][m]);
    	return 0;
    }
    

      

  • 相关阅读:
    除了类 Excel, SpreadJS 表格控件还能为系统开发带来什么价值?
    纯前端表格控件SpreadJS V14.0发布:组件化编辑器+数据透视表
    攻克金融系统开发难点,借助SpreadJS实现在线导入Excel自定义报表
    50.Pyinstaller打包时出现:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce...
    centos 查看日志
    TP5.1 控制器(基类)
    tp5.1 微信支付、支付宝、招商支付(Payment)
    TP5.1 发送邮件
    tp5.1 模型集成
    TP5.1 阿里云短信
  • 原文地址:https://www.cnblogs.com/zhouzhendong/p/51Nod1634.html
Copyright © 2011-2022 走看看