1. 程式人生 > >【Codeforces 499D】Name That Tune

【Codeforces 499D】Name That Tune

ORC tun 結果 name span class clas 浮點 for

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}?\)

即可。

【Codeforces 499D】Name That Tune