【Codeforces 499D】Name That Tune

Codeforces 499 D

题意:给\(n\)个曲子,每个曲子每一秒有\(p_i\)的几率可以被猜出来,过了\(t_i\)秒肯定能被猜出来,猜完第\(i\)首歌立即播第\(i+1\)首,问\(T\)秒内期望猜多少首。

思路:考虑\(dp\)\(dp(i,j)\)表示在第\(j\)个时间点正好猜出第\(i\)首歌的概率

转移方程:\(dp(i,j)=dp(i-1,j-t_i)\times(1-p_i)^{t_i-1}+\sum_{x=1}^{t_i-1}dp(i-1,j-x)\times(1-p_i)^{x-1}\times p_i​\)

可以看出,这个肯定是要超时的,所以对\(\sum\)内进行优化

原优化:记录两个变量\(sum\)\(mul\)表示\(\sum\)内的式子结果是\(sum\times mul\times p_i\),然后在\(j+1\)\(sum+dp(i-1,j-1)/mul-dp(i-1,j-t_i)/(mul/(1-p_i)^{t_i-1})\)\(mul\times (1-p_i)\)即可。

评:这个优化看起来很对,但是由于\(mul\)实在太小,浮点误差导致变成了\(0\),所以不行。

优化:类似滚动哈希,记录\(sum​\)表示\(\sum​\)内的式子结果是\(sum\times p_i​\),然后在\(j+1​\)\(sum\times (1-p_i)+dp(i-1,j-1)-dp(i-1,j-t_i)\times (1-p_i)^{t_i-1}​\)即可。

猜你喜欢

转载自www.cnblogs.com/denverjin/p/10468246.html