HDU 5729 - Rigid Frameworks
题意:
对于一个由n*m个1*1的菱形组成可任意扭曲的矩形(姑且这么说),求添加斜线*(两种)让菱形变成正方形,使得整个矩形固定且无法扭曲的方案数。
分析:
n*m的矩形有如下性质:( 平行具有传递性 )
任意一行的每一条竖边永远保持平行,任意一列的每一条横边永远保持平行
当一个单位格加上斜边的时候,这个单位格的形状就不能改变,实质上就是组成这个单位格的横边和竖边保持着一个垂直关系.
一旦组成这个小单元格的横边和竖边保持了一个垂直关系,那么横边所在的列和竖边所在的行均能保持垂直关系.
即任意一行和任意一列均为一个整体。
那么题意即为使任意列的横边和任意行竖边均保持垂直关系
还有二维平面上两列横边若垂直同一行竖边,则两列横边互相平行,即它们可以看做一个整体(属于同一个集合)
于是,将纵边抽象为点集(size为行数),将横边抽象为点集(size为列数),垂直关系抽象为连线,即求连通二分图的方案数。
转移方程式:
DP[n][m] = 3^(n*m) - ∑( DP[i][j] * C[i-1][n-1] * C[j][m] * 3^( (n-i)*(m-j) ) ) (i!=n||j!=m);
意为,所有状态数 - 两点集中选取(i,j)个点在同一个连通块内,剩下的点任意状态
注意点:
1.必须枚举固定的一个点所在的连通块情况以避免计数重复, 那么这个连通块有一个点是确定的了,所以,共 i 条横边的枚举为 C[i-1][n-1],且i,j是等价的,故只选择其中任意一边就可以了
2.另外,因为选择的是 所有情况 - 不合理情况 的计数方法,不合理情况至少有两个以上的连通块连通块内,故 i==n且j==m 的情况为合法情况,此时该退出循环
了解来龙去脉之后,代码就显得不那么重要了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MOD = ;
long long C[][],pow3[];//组合数,幂
long long dp[][];
void Init()
{
C[][]=;
for(int i = ; i <= ; i++){//组合数 C[下标][上标]
C[i][] = C[i][i] = ;
for(int j = ; j < i; j++)
C[i][j] = (C[i-][j] + C[i-][j-]) % MOD;
}
pow3[] = ;
for(int i = ; i <= ; i++) //3的幂
pow3[i] = * pow3[i-] % MOD;
}
void CalDP()
{
dp[][] = dp[][] = ; //重要的边界条件,一个点时必然联通且方案唯一
long long tmp;
for(int i = ; i <= ; i++)
{
for(int j = ; j <= ; j++)
{
// if(i==1||j==1) continue;
dp[i][j] = pow3[i * j];//总数目
for(int ii = ; ii <= i; ii++)//至少有自己
{
for(int jj = ; jj <= j; jj++)
{
if(ii == i && jj == j) continue;
tmp = C[i-][ii-] * C[j][jj] % MOD;
tmp = tmp * dp[ii][jj] % MOD;
tmp = tmp * pow3[ (i-ii)*(j-jj) ]%MOD;
dp[i][j] = (dp[i][j] - tmp + MOD) % MOD;
}
}
}
}
}
int main()
{
Init();
CalDP();
int n,m;
while(~scanf("%d%d",&n,&m))
{
printf("%lld\n",dp[n][m]);
}
}
HDU 5729 - Rigid Frameworks的更多相关文章
- HDU 5729 Rigid Frameworks(连通性DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5729 [题目大意] 给出一个n*m的方格框,可以在单位矩形中添加两种对角线的线,使得其变得稳定,问 ...
- HDU 5729 Rigid Frameworks (联通块计数问题)
题目传送门 通过看题解画图可以发现: 不论怎么转,一列里的横边/一行里的竖边始终平行 当我们加固一个格子时,会让它所在的这一行的竖边和这一列的横边保证垂直 而我们的目标是求所有竖边和横边都保证垂直的方 ...
- 2016 Multi-University Training Contest 1 G. Rigid Frameworks
Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- Rigid Frameworks (画图二分图规律 + DP + 数学组合容斥)
题意:方格n*m,然后对于每一个格子有3种画法1左对角线2右对角线3不画,求让图形稳定的画法有多少种? 思路:通过手画二分图可以发现当二分图联通时改图满足条件,然后我们对于一个dp[n][m]可以利用 ...
- 2016 Multi-University Training Contest 1
8/11 2016 Multi-University Training Contest 1 官方题解 老年选手历险记 最小生成树+线性期望 A Abandoned country(BH) 题意: 1. ...
- 2016 Multi-University Training Contest 1 solutions BY HIT
首先向大家表示抱歉,因为这套题是去年出的,中间间隔时间太长,今年又临时准备仓促, 所以部分题目出现了一些问题,非常抱歉. Abandoned country 首先注意到任意两条边的边权是不一样的,由此 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
随机推荐
- iOS 证书错误 Certificates下面的 App Store and Ad Hoc是灰的?? 点不了
原因 因为一个用户名下只能同时有一个发布证书,你之前建立了某个证书并且没有使用的话就无法再创建了,先把它撤销或者使用后才可以继续创建新的
- 类似QQ侧滑菜单功能实现
之前的那文章简单实现了菜单侧拉功能,但是做不到像QQ那样导航条和tabBar一起移动...之后在网上找资料,有了思路,就自个写了个demo试试水. 先创建QHLMainController控制器,并把 ...
- automaticallyAdjustsScrollViewInsets的作用
简单点说就是automaticallyAdjustsScrollViewInsets根据按所在界面的status bar,navigationbar,与tabbar的高度,自动调整scrollview ...
- CDZSC_2015寒假新人(1)——基础 i
Description “Point, point, life of student!” This is a ballad(歌谣)well known in colleges, and you mus ...
- C# 加密可逆
现在一直在做一个小软件,公司的通讯录系统,也没什么功能增删改查,这算是我来这个公司实习的第一件事吧. 在修改个人信息的时候一直对于密码显示这个存在矛盾,不知道应该是要哪种形式去做,后来自己就先用md5 ...
- Python学习(四) Python数据类型:序列(重要)
插播一下,先了解一下Python的数据类型,Python现有的数据类型有好多,最重要的有列表.元组.字典 列表:我觉得可以对应java中的数组 list=['physics', 'chemistry' ...
- 理解Python中的装饰器
文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出 ...
- iOS Layer CABasicAnimation
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- "windows 正在启动"
xp 在cmd下使用了control userpasswords2 设定开机不需要密码之后,开机停留在“window正在启动”,无法进入.估计是设置的时候密码输入错误了( 并不会提示你错误:() 在停 ...
- 8051、ARM和DSP指令周期的测试与分析
在实时嵌入式控制系统中,指令周期对系统的性能有至关重要的影响.介绍几种最常用的微控制器的工作机制,采用一段循环语句对这几种微控制器的指令周期进行测试,并进行分析比较.分析结论对系统控制器的选择有一定的 ...