题目链接
题目类型:概率DP
题目来源:2016 Multi-University Training Contest 5
题目分析
题目大意
Alice去取款机取钱,她不记得自己到底有多少余额了,她知道自己的余额在[0,k]区间之内。取款机也无法显示余额。取款机还有另外一个毛病——当你取的钱的数量大于你现有的钱的数量的话,就会报警,当报警次数大于w次之后,警察就会来把Alice带走。但是Alice足够聪明,每次都会用最少的次数把钱全部取走,问Alice取钱次数的期望值是多少?
解析
首先先考虑最笨的情况下,一次取一块钱,那么直到报警为止,然后把所有的钱都取走。
稍微聪明一点的做法是,按w块钱为步长的取,当取到第kw块钱无法取的时候,就取kw−1,kw−2,…,直到取到能取出的情况为止。
再聪明一点的话,是二分的去取钱。
最聪明的做法是一种接近二分的做法,举个例子,当你的金额上限为20元最大报警次数为3时,你可以先取10块钱,如果取10块钱都报警了,那相当于你可以取9块钱可以报警两次的情况。如果取10块钱没有报警的话,那么就相当于存在一种11~20块钱你可以报错3次的情况。这样就形成了一个DP,DP[i][j]状态表示取0 i块钱,可以报错j次,由此可以写出状态转移方程dp[i][j]=min(dp[k−1][j−1]+dp[i−k][j]+i+1)其中i+1表示0 i各取一次。根据题解我们可以发现,当报警大于15时一定可以达到目的。
官方题解
E(i,j):存款的范围是[0,i],还可以被警告j次的期望值。
E(i,j) = $max{k=1}^{i}{\frac{i-k+1}{i+1} E(i-k,j)+\frac{k}{i+1}E(k-1,j-1)+1}这样时间复杂度是O(K^2W)的。假如Alice使用的是二分策略,那么在最坏情况下至多被警告\left \lceil log{2}{K} \right \rceil$ 次。
于是W:=min(W,15)就可以了。
写题解的时候顺便看看别人的代码,发现有一个更优雅的。传送门
代码
1 |
|