東京大学 新領域創成科学研究科 メディカル情報生命専攻 2019年8月実施 問題12
Author
Description
For a mouse aging experiment, we need to pair male and female mice, with these rules:
- Each mouse can match at most one other mouse.
- Each match must be between opposite genders.
- A female can only match a younger male.
Assume that no two mice have exactly the same age. We have a list of mice, numbered from 1 to in order of increasing age.
is the number of males among the first mice.
is the number of ways of making matches among the first mice.
Let (i 1).
(1) What is when ?
(2) Suppose we have already made matches among the first mice, and . How many remaining ways are there of matching the -th mouse?
(3) Write a formula for in terms of and .
在一项小鼠衰老实验中,我们需要为雄性和雌性小鼠配对,规则如下:
- 每只小鼠最多只能与另一只小鼠匹配。
- 每次匹配必须是异性之间的匹配。
- 雌性只能与比自己年轻的雄性匹配。
假设没有两只小鼠年龄完全相同。我们有一个编号为 1 到 的小鼠列表,按年龄递增顺序排列。
是前 只小鼠中雄性的数量。
是前 只小鼠中进行 次匹配的方法数量。
设 (i 1)。
(1) 当 时, 是多少?
(2) 假设我们已经在前 只小鼠中进行了 次匹配,且 。匹配第 只小鼠还有多少剩余的方法?
(3) 用 和 表示 的公式。
题目描述
在小鼠衰老实验中给雌雄小鼠配对,规则为:每只小鼠至多参加一次配对;每对必须一雄一雌;雌鼠只能与比它年轻的雄鼠配对。所有小鼠年龄互异,并将 只小鼠按年龄递增编号为 。定义
为前 只小鼠中的雄鼠数, 为仅使用前 只小鼠组成恰好 对的方案数,并规定
回答下列问题:
- 对 ,求 。
- 已在前 只中组成 对,且 ,求为第 只雌鼠选择尚未配对、比它年轻的雄鼠共有多少种可能。
- 用 与 写出 的递推式;公式须同时反映第 只小鼠的性别以及选择不配对或新增一对的情形。
考点
- 有序异性配对计数:利用年龄顺序保证新出现的雌鼠只能选择此前雄鼠,并扣除已被 对占用的雄鼠。
- 组合计数递推:按第 只小鼠是否参与新配对分类,把前缀方案数递推到更长前缀。
- 动态规划边界:正确处理零对方案、单只小鼠及无法达到的配对数量,为二维计数表设置初值。
Kai
(1)
For when , since we only have one mouse, we cannot form any pairs if . Therefore,
(2)
If the -th mouse is female (), she can be paired with any of the males among the first mice, as long as each male has not been paired yet. Therefore, the number of ways of matching the -th mouse is:
since is the total number of males among the first mice, and is the number of pairs already formed.
(3)
To derive the formula for :
- If the -th mouse is male (), he cannot form a new pair immediately. Thus,
- If the -th mouse is female (), she can form a new pair with any of the available males among the first mice. This adds new ways of making matches by pairing her with one of these males.
Combining both cases, we get the formula:
Hence, the formula for can be written as:
Knowledge
动态规划 组合计数
重点词汇
- Match 配对
- Male 雄性
- Female 雌性
- Combination 组合
- Dynamic Programming 动态规划
参考资料
- Kenneth H. Rosen, "Discrete Mathematics and Its Applications", Chapter 7: Counting and Probability
算法代码
def count_mouse_pairings(F, n):
# Initialize G array
G = [0] * (n + 1)
for i in range(1, n + 1):
G[i] = G[i-1] + (1 - F[i])
# Initialize C array
C = [[0] * ((n // 2) + 1) for _ in range(n + 1)]
# Base cases
for i in range(n + 1):
C[i][0] = 1
# Dynamic Programming
for i in range(1, n + 1):
for j in range(1, min(i // 2, G[i]) + 1):
if i == 1:
C[i][j] = 0
else:
C[i][j] = C[i-1][j] + (G[i-1] - (j-1)) * C[i-1][j-1] * F[i]
return C
# Example usage
n = 5
F = [0, 1, 0, 1, 0, 1] # 0-indexed, but we ignore F[0]
result = count_mouse_pairings(F, n)
# Print results
for i in range(1, n + 1):
for j in range(min(i // 2, sum(1 - F[k] for k in range(1, i+1))) + 1):
print(f"C[{i}][{j}] = {result[i][j]}")