标签:如何 i+1 常见 推出 复杂 就是 选择 连通 bzoj
编号为1~n的人排成一排,问有多少种排法使得任意相邻两人的编号之差不为1或-1。
n<=1000
破坏空位:有两个相邻的之间
我们设\(f[i][j]\)表示1~i的排列,有j组相邻的相差1,且i和i-1不相邻的方案数;
我们设\(g[i][j]\)表示1~i的排列,有j组相邻的相差1,且i和i-1相邻的方案数;
考虑插入i+1的位置,有:
不破坏空位且不与 i 相邻、不破坏空位且与 i 相邻、破坏空位且不与 i 相邻、破坏空位且与 i 相邻(只发生在 g 的转移) 4种。
分别推一下方案数:
首先考虑i和i-1相邻的方案数:
我们考虑一下i-2,i-1和i的关系:
\(g[i][j]=g[i-1][j]+g[i-1][j-1]+f[i-1][j-1]*2\)
同理可以推出\(f[i][j]\)的转移方程:
\(f[i][j]=g[i-1][j+1]*j+f[i-1][j+1]*(j+1)+g[i-1][j]*(i-j-1)+f[i-1][j]*(i-j-2)\)
最后的答案就是\(f[n][0]\)
时间复杂度 O(n^2) 。
有n个珠子,第i和j个珠子之间有\(c[i][j]\)条不同的绳子可选。每对珠子之间可以选择不连绳子,也可以选择用其中一种绳子连接。
问有多少种方案能使n个珠子成为连通图。
n<=16
连通图计数套路: 用总数减去不连通的方案数,而不连通的方案数,可以枚举1号点所在连通块的点集(有的问题中是大小) ,用这个点集的连通方案数乘以剩余点集的总方案数即可。???
我们设两个数组,g[s]表示s状态下的所有情况,即s状态下的点两两之间任意连边(包括不连边的情况),f[s]表示s状态下的合法情况,即使得s状态下所有点连通的合法情况。那么答案就是f[2^n-1]。
\(g[s]=g[s-(1<<i)]+\sum_{j\in s-(i<<i)}[i][j]\) \(O(n*2^n)\)
然后我们可以很容易地求出g[s],我们求出g[s]后,考虑如何求f[s],f[s]就是g[s]减去所有的不合法情况。那么我们可以枚举s的所有子集,设子集为i,那么不合法的情况就是g[i]*f[s^i],我们减去这些情况,就能求出f[s]了。
标签:如何 i+1 常见 推出 复杂 就是 选择 连通 bzoj
原文地址:https://www.cnblogs.com/zhuier-xquan/p/11330013.html