1 条题解
-
0
题意理解
有 ( L ) 把真锁和 ( K ) 把假钥匙,总钥匙数为 ( L+K )。
( N ) 个人轮流尝试,每人每次选一把钥匙和一把锁,以最大化当前尝试的成功概率。
若成功则钥匙和锁都移除,否则钥匙保留但知道它打不开该锁。
目标是打开所有 ( L ) 把锁,求每个人成功开锁的期望次数。关键观察
-
状态描述
设当前剩余真锁数 ( i ),剩余假钥匙数 ( k ),轮到第 ( j ) 个人操作(1 ≤ j ≤ N)。
由于循环轮流,只需记录当前轮到谁。 -
最优策略
每次选择钥匙和锁时,若存在“已知匹配”(即某钥匙已知能打开某锁),则必然选它(概率 1)。
否则所有未尝试组合概率相等,需最大化成功概率:- 若选择真钥匙 + 真锁:概率 ( \frac{1}{i+k} )(因为真钥匙均匀随机匹配真锁)。
- 若选择假钥匙 + 真锁:概率 0。
所以最优策略是选一对真钥匙和真锁(若存在),否则只能随机试。
-
动态规划
定义 ( dp[i][k][j] ) 表示剩余 ( i ) 把真锁、( k ) 把假钥匙,当前轮到第 ( j ) 个人时,该人未来成功开锁的期望次数。
由于对称性,( j ) 可映射为相对位置,用循环处理。 -
转移分析
当前操作者选择一对“真钥匙-真锁”组合:- 成功概率 ( p = \frac{1}{i+k} ),成功则获得 1 次成功,状态转移为 ( dp[i-1][k][j+1] )。
- 失败概率 ( 1-p ),失败后得知该钥匙打不开该锁,但可推断信息,影响后续概率。
失败后的推断是关键:- 若选择的钥匙是第 ( x ) 把真钥匙(按某种顺序),锁是第 ( y ) 把真锁,则失败说明该钥匙匹配其他锁。
- 根据已有失败信息,可能缩小匹配可能,从而提高后续成功概率。
-
推断信息处理
用“匹配图”建模:真钥匙与真锁构成完全二分图,每次失败删除一条边。
最优策略会优先选择度最小的钥匙和锁(最大化成功概率)。
经过推导,失败后的状态可以归约为 ( dp[i-1][k][j+1] ) 或 ( dp[i][k-1][j+1] ) 等,但需加权平均所有可能的选择。 -
代码中的转移分类
- ippatsu:直接成功的情况。
- choose ---:选择后失败,但根据位置信息更新概率。
- choose |:另一种失败情况。
- 假钥匙参与的情况。
-
预处理与循环
预处理逆元 ( inv[i] ) 用于模运算。
循环处理 ( i ) 从 1 到 ( L ),( k ) 从 0 到 ( K ),计算所有 ( dp[i][k][*] )。
最终输出 ( dp[L][K][1..N] )。
算法标签
- 概率期望 DP
- 博弈论与最优策略
- 循环状态转移
- 模运算与逆元
复杂度
状态数 ( O(L \cdot K \cdot N) ),转移 ( O(N) ),总复杂度 ( O(L \cdot K \cdot N^2) )。
本题 ( N \leq 50, L \leq 5000, K \leq 50 ),可过。样例验证
样例 1:( N=3, L=1, K=4 )
每人成功概率依次 ( 2/5, 2/5, 1/5 ),对应模意义下输出匹配。
样例 2:( N=3, L=2, K=0 )
推导期望 ( 1/2, 1, 1/2 ),输出匹配。 -
- 1
信息
- ID
- 5772
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者