lec7 Trees(2)
lec7 Trees(2)
又回到了树,依然是只记录比较重要的部分,其他就不记录了。😎
火柴游戏策略分析
我们考虑一个有 n 根火柴的游戏,甲乙两人依次从中取走 1 根或 2 根火柴,每次轮到一个人时,他可以从剩余火柴中取走 1 根或 2 根,且不能不取。取走最后一根火柴的人为胜方,且甲方先取。
游戏过程与树形图
在树形图中,圆圈和方框分别表示不同的局面,其中:
- 圆圈中的数字表示当前轮到甲方取时剩下的火柴数目。
- 方框中的数字表示当前轮到乙方取时剩下的火柴数目。
显然,当剩下 1 或 2 根火柴时,乙方(即轮到乙方取时)必胜,表示为 -1。其余情况下,甲方胜,表示为 +1。
取胜策略
我们可以通过递归的方式推断出不同局面下的胜负情况。总结出以下几个关键规则:
- n = 1 或 n = 2
时,乙方必胜,因为甲方在其回合中只能取走 1 或 2
根火柴,最终必然会留下乙方能够取走最后一根火柴。
- 例如,当 n = 1 时,甲方必须取走 1 根,乙方获胜。
- 当 n = 2 时,甲方只能取 1 或 2 根,乙方最终获胜。
- n = 3k (k 为正整数),如果先取者取走 a 根(1 或
2),那么乙方可以根据剩余火柴数的情况,通过取走 3 - a
根,使得剩下的火柴数正好是 3(k - 1),这时候甲方必败。
- 换句话说,如果火柴数目是 3 的倍数(即 n = 3k),先取者必败。
- n ≠
3k,此时甲方可以通过选择合适的取法,使得剩余的火柴数恰好为 3
的倍数(n - a = 3k)。这样乙方就会处于必须面对 3
的倍数个火柴的局面,从而乙方必败。
- 例如,当 n = 7 时,甲方可以取 1 根或 2 根火柴,使剩下的火柴数目为 6 或 5。这时乙方面对 6 根或 5 根火柴,甲方最终必胜。
幂集的求解及二叉树构造
幂集定义:
给定一个集合 $ A = {a_1, a_2, , a_n} $,其 幂集 $ P(A)
$ 是指所有 $ A $ 的子集构成的集合,包括空集和 $ A $ 本身。
对于集合 $ A = {1, 2, 3} $,其幂集 $ P(A) $ 是:
$ P(A) = {, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}} $
求幂集的过程:
从集合 $ A $ 中每个元素的角度来看,集合中的每个元素都有 两种状态:
- 属于幂集中的某个子集。
- 不属于幂集中的某个子集。
这意味着,每个元素的选择都是 二选一:要么“取”(即加入子集),要么“不取”(即不加入子集)。因此,求幂集的过程相当于依次为集合 $ A $ 中的每个元素决定是否加入某个子集。
二叉树构造:
通过二叉树来表示求幂集的过程是一个直观的方式。每个元素的决策可以视为一个二叉树的分支结构。具体地,构造过程如下:
- 树的根节点代表开始时的空集。
- 对于每个元素,根节点的左右子节点代表该元素是否被包含在当前子集中的两种情况:
- 左子节点表示该元素不属于当前子集。
- 右子节点表示该元素属于当前子集。
每次向下遍历树,选择是否包含当前元素,直到遍历完所有元素。最终每个叶子节点代表一个子集。
以集合 $ A = {1, 2, 3} $ 为例,构造二叉树:
二叉树的遍历:
- 树的叶节点表示幂集中的每一个子集。
- 树的深度为集合中元素的个数 $ n $,即遍历过程中会有 $ n $ 层决策。
- 总共有 $ 2^n $ 个叶节点,表示有 $ 2^n $ 个子集。对于每一个元素,只有两种可能:取或不取,因此总共有 $ 2^n $ 个不同的组合。
示例说明:
对于集合 $ A = {1, 2, 3} $,通过构造二叉树可以清楚地看到其幂集 $ P(A) $:
- 从根节点开始,逐层遍历决定是否选择每个元素。
- 每条路径到达的叶节点就是一个子集,例如:路径左-左-右对应的子集是 $ {1, 3} $,路径右-左-左对应的子集是 $ {2} $ 等等。
通过二叉树的方式,我们能够直观地表示求幂集的过程。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论