ZLOJ练习23总结
written on 2022-06-24
期望与概率专场,打的很烂,这一专题还需要多加训练!
在分析之前,我想先重新申明一下期望的表示意义:某个量的期望,即等于该事件在平均情况下求得的这个量。 这是所有期望dp的基础,也是转移时,期望要除以方案数的根本原因。
另外,总结一下dp题的几个步骤。
-
模拟题意,找出决策点。
-
设计状态。
-
判断边界。
-
写出状态转移方程。
-
code
先判断边界!
题意里提到了概率,要求的问题是平均情况下的得分,也就是期望。接着我们来逐步分析一下期望的计算方法。
首先要模拟题意,对于这道题而言,对于一个物品,有三种可能的情况。
-
吃这个物品,当然这是在子集均已选过的前提下做出的决策。
-
想吃这个物品,但是没法吃。
-
直接不吃这个物品。
\(2,3\) 本质上是同一种决策,可以用相同的方法来进行转移。
因为题目要求最优,但是每一次决定决策是否最优是取决与未来的,所以,这里有两种方法,一种是逆推的动态规划,另一种是记忆化搜索,补题时采用的方法是记忆化搜索。当然这题的状态是很显然的,也就是一维记录时间戳,另一维状压记录已选物品。
因为此次的状态取决于未来,所以边界点在最后,那么可以先写出边界:
if(tim>k) return 0;
(期望贡献为 \(0\))
考虑dp的本质,每一次决策,我们都可以假设子问题已经全部获解,那么:
-
\(f_{i,j}=\max(f_{i+1,j},f_{i+1,j|(1<<k)}+p_k\)(该物品可选的决策)
-
\(f_{i,j}=f_{i+1,j}\)(不能选该物品)
最后,注意期望的计算要除以转移过来的情况数!也就是除以物品个数 \(m\)。当然这个除可以用分配率在转移的时候直接除。
先看 \(C\) 题,题意。
题面很长,分清英雄,三种血量的奴隶主,克苏恩三个角色。
同样的,首先模拟题意。对于一次攻击,有四种决策。
-
攻击英雄。
-
攻击1血奴隶主。
-
攻击2血奴隶主。
-
攻击3血奴隶主。
其中,后两种情况可能会使3血奴隶主个数加 \(1\)。
明确了决策,我们就可以设计状态了,这里有两种可以直观想到的状态,一种是记录三种奴隶主的数量(1),攻击次数(2),第3维记录英雄血量,当然这个第三维可以直接当成记录内容然后略去,否则记录的内容应当是这一情况的概率。
补题时选择的是不记第 \(3\) 维。按照一开始提供的dp思路,我们先想一想它的边界。一般来说,要求全局的期望,我们可以先想定最末端,停止时刻期望的贡献,这也就是边界,然后倒推回来。这个思路和 \(A\) 题有异曲同工之妙,同样可以用记忆化搜索,这样更直观。\(Code\)
个人感觉这题事实上是四道题中最难想的,这题的难点主要在于状态的设计。在思考这题时,我们必须跳出定式思维,也就是以绝对位置来分析这种问题。对于这种类似于约瑟夫问题的题目,一般采取的方法是以相对位置为状态进行dp转移。
那么对于这题,很明显的,一次摸牌(杀人环节)对应dp的一个阶段。我们可以设 \(f_{i,j}\) 表示还剩下 \(i\) 个人,从庄家数位置为 \(j\) 的人获胜的概率。如果是这样,那么再确定边界。很明显,有 \(f_{1,1}=1\)。然后考虑决策,有 \(m\) 种牌,对于每种摸牌的情况,我们可以画图来帮助转移,具体可以见这篇题解(感谢@Drinkkk大佬)。同样的,因为是概率的转移,所以相加后还要除以情况数 \(m\),这样才是对应的概率。
其实题意已经说得很清楚了,要求的是二进制编码的最小期望长度,这就是哈夫曼树的题意嘛!但是还是要注意审题,题目说的是“对 \(n\) 天所有 \(4^n\) 种可能的天气状况进行二进制编码”而不是“对每种天气进行编码”。正因此我比赛的时候没有写这题。
有一种很显然的暴力做法,也就是暴力枚举 \(4^n\) 种可能的天气状况,然后在枚举的同时计算出概率,塞入小根堆中跑哈夫曼树,最短的编码就是所有非叶子结点的概率和。
但是很显然这会超时,因此需要考虑优化。与 \(C\) 题有一些些类似,我们可以将相同的天气状况放到一起考虑。具体地,四重循环枚举每一种天气的数量,用乘法原理计算这种情况的概率,并用排列组合计算出这种情况的个数。最后再将这些情况(以结构体记录)塞入小根堆,然后模拟一下取的过程,就可以求出最小的期望编码长度了。Code(包括暴力与满分做法。)