组合数学:从入门到入土

更新ing

菜鸡 \(wljss\) 来讲组合数学啦。

组合数学博大精深,主要是爱数数的人上大学了,从模拟赛到NOI都出现过。

一些技巧可以看这里

其实看完上边那个也就没啥好说的了

上例题吧

P1595 信封问题

这里有讲解,直接放代码233

P3197 [HNOI2008]越狱

首先我们可以发现总的方案很好求,就是 \(m^n\).

所以我们采用求 补集 的思想

有多少可能不会发生越狱呢?

第一个人有 \(m\) 种可能的信仰。

从第二个人开始,每个人的信仰都要和上一个人不同,每个人有 \(m-1\) 种。

所以答案就是 \(m^n - m \times (m-1)^{n-1}\)

P1057 传球游戏

\(dp[i][j]\) 为第 \(i\) 个人在第 \(j\) 轮拿到球的方案数。

每次考虑一个人的求可能从哪个方向上传过来.

\(f[i][j]=f[i-1][j-1]+f[i+1][j-1]\)

当然 \(1\) 号和 \(n\) 号要特殊处理一下。

P6057 [加油武汉]七步洗手法

总的三元环个数很好求,任意选出 \(3\) 个点就能组成,所以总的三元环个数是 \(C_n^3\)

我们采用求 补集 的思想,不同色的三元环有多少个?

考虑每个点,如果有 \(d\) 条白边,那么就有 \(n-d-1\) 条黑边,两两组合就会产生 \(d \times (n-d-1)\) 个三元环

考虑这样我们求出来的是啥?考虑对于每个不同色的三元环,会被每对不同色的边各枚举一次,一共会被枚举 \(2\) 次.

所以\(/2\)后才是真正的不同色三元环个数。

P1535 [USACO08MAR]Cow Travelling S

简单 \(DP\),设 \(dp[i][j][k]\) 为走了 \(k\) 步,走到坐标 \((i,j)\) 的方案数。

转移的话直接从周围 \(4\) 个方向转移就行了。

P1144 最短路计数

普通求最短路的话一定要用DIJ,SPFA早就死了。

\(f[i]\)当前情况下 \(i\) 的最短路计数

首先初始化 \(f[1]=1\)

然后考虑求最短路的过程.

如果 \(dis[to[i]] > dis[x] + 1\),由于最短路更新了, 当前情况最短路只能由 \(x\) 走过来,\(f[to[i]] = f[x]\)

如果 \(dis[to[i]] = dis[x] + 1\),最短路没有更新, 当前情况最短路也能由 \(x\) 走过来,\(f[to[i]] += f[x]\)

跑最短路的时候更新就行了.

P1450 [HAOI2008]硬币购物

首先每次背包一下答案是对的,但是复杂度太高。

对于这种有选取数量限制的计数题,我们通常枚举有哪些突破了数量限制,然后容斥。

对于这道题来说,我们先用四种面值做一个完全背包。

然后枚举哪些面值肯定会突破限制,这个可以通过 \(tmp -= c * (b + 1)\) 来实现,也就是先选出来 \(b+1\) 个,再怎么选都会突破限制。

答案并不是 有0个强制突破限制的情况,因为虽然没有强制突破的情况,但因为随便选还是有突破的情况。

所以我们需要减去强制有1个突破的情况。

然后会发现减的有点多,要加上强制有2个突破的情况.以此类推。

P4071 [SDOI2016]排列计数

首先枚举哪些位置满足 \(a_i=i\),那么剩下的 \(n-m\) 个数就需要错排。

所以答案就是 \(C_n^m \times f[n-m]\)

P2513 [HAOI2009]逆序对数列

\(f[i][j]\) 为用 \(1\) ~ \(i\) 组成的序列有j个逆序对的方案数。

我们将每个数一个一个插入原序列,考虑第 \(i\) 个数放在原来的序列的哪个位置,由于之前的数都比 \(i\) 小,所以如果插在 \(k\) 个数后面,就会增加 \(k\) 个逆序对。

所以 \(\displaystyle f[i][j]=\sum_{k=0}^{min(i-1,j)}f[i-1][j-k]\)

发现后面那一段是连续的一段,可以用前缀和优化一下。

P5664 Emiya 家今天的饭

考虑容斥:合法方案:总方案-不合法方案

总方案很好求,可以 \(DP\) ,也可以用 \(\displaystyle (\prod_{i=1}^{n} (1 + \sum_{j=1}^{m}a[i][j]))-1\) 来求。

如果一个方案不合法,一定是某个食材出现次数超过了 \(\lfloor \frac{k}{2} \rfloor\) 次,并且能造成这个的最多只有 \(1\) 个食材。

枚举哪个食材不合法,\(DP\)\(g[i][j][k]\) 为前 \(i\) 个里面,一共选了 \(j\) 个,其中 \(id\) 选了 \(k\) 个的方案数

时间复杂度 \(O(m n^3)\) ,只有84分

发现同时记录 \(j\)\(k\) 就有点多余,重新设 \(g[i][j]\) 为前 \(i\) 个里,\(id\) 选的比其他的多 \(j\) 个时的方案数。

时间复杂度就成了 \(O(mn^2)\),可以过,但是因为可能 \(j\) 有可能是负数,所以需要整体下标加上 \(n\)

posted @   wljss  阅读(586)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示