也許更好的閱讀體驗
\(\mathcal\)
給出\(n\)個技能,每個技能按輸入順序有\(p[i]\)的概率釋放並造成\(d[i]\)的傷害。每輪遊戲從前往後順序檢視每個技能,若技能發動過則跳過,沒發動過則以\(p[i]\)的技能發動,即每個技能只能發動一次,若將乙個技能發動,則進行下一輪遊戲,沒有成功發動或被跳過就檢視下乙個技能,一輪遊戲可能每個技能都不發動,問\(r\)輪遊戲一共能造成的傷害期望。
輸入方式
t組資料
接下來組資料
每組資料第一行\(n,r\)
接下來\(n\)行\(p_i,d_i\)表示該技能發動概率以及傷害
\(1 <= t <= 444, 1 <= n <= 220, 0 <= r <= 132, 0 < p_i < 1, 0 <= d_i <= 1000\)
輸出格式
每組資料輸出一行期望傷害,建議保留\(10\)位小數
\(\mathcal\)
因為有乙個順序檢視的限制,沒有後效性的狀態是十分不好設的,因為不知道前面有幾個技能發動了,若乙個技能前面的技能在某輪發動了,則該技能本輪一定不能發動,若前面有些技能發動過,則它們都會被跳過
為了解決這種情況,我們設狀態時試著強制限制技能發動(\(nr\)列舉情況),當然,設的狀態仍然要滿足所有情況都考慮在內
設\(f[i][j]\)表示對前\(i\)個技能進行了\(j\)輪遊戲造成的概率
若有前\(i\)個技能進行了\(j\)
則有\(j\)輪不會考慮第\(i+1\)個技能
即有\(r-j\)輪遊戲選擇了\(i\)之後的技能
此時考慮第\(i+1\)個技能的情況,分為兩種
有\(p[i+1]^\)的概率\(i+1\)號技能從未發動
有\(1-p[i+1]^\)的概率\(i+1\)號技能發動過
需要注意的是,此時已經確定前\(i\)個技能進行並只進行了\(j\)輪遊戲,其概率應該也計算在內
所以有\(f[i+1][j]+=1-p[i+1]^f[i][j]\)
\(f[i+1][j+1]+=(1-p[i+1]^)f[i][j]\)
\(j+1\)要小於等於\(r\)
初值\(f[0][0]=1\),答案在中途計算
計算了概率,別忘了求的是期望傷害,在求概率的時候順便用概率乘以傷害
\(\mathcal\)
/*******************************
author:morning_glory
lang:c++
created time:2023年07月22日 星期一 14時17分22秒
*******************************/
#include #include #include #include using namespace std;
const int maxn = 255;
int t,n,r;
double ans;
double p[maxn],d[maxn];
double f[maxn][maxn];
int main()
}} printf("%.10lf\n",ans);
} return 0;
}
本篇部落格亦被收進期望總結
如有**講得不是很明白或是有錯誤,歡迎指正如您喜歡的話不妨點個贊收藏一下吧
HNOI2015 期望dp 亞瑟王
描述 小 k 不慎被 ll 邪教 了,程度深到他甚至想要從亞瑟王邪教中脫坑。他決定,在脫坑之前,最後再來打一盤亞瑟王。既然是最後一戰,就一定要打得漂 亮。眾所周知,亞瑟王是乙個看臉的遊戲,技能的發動都是看概率的。作為乙個非 洲人,同時作為乙個前 oier,小 k 自然是希望最大化造成傷害的期望值。但...
HNOI2015 亞瑟王(概率dp)
題面太長了就不複製了,傳送門 一道做了還是很懵逼的題目,感覺以後碰到類似的還是不會,果然hnoi題目很皮。題解傳送 補充一下吧。感覺他的部落格已經寫得很好了.orz 需要的可以兩邊一起看 1.期望的線性性質 e x y e x e y x,y 是兩個不同的事件 e kx ke x k為常數 2.單獨...
bzoj4008 亞瑟王 概率dp
重述題意 卡牌有發動概率和傷害,每張卡牌只發動一次,按順序遍歷,給出輪數,求傷害期望。神思路啊 我的腦子基本想不出來 如果說正面剛,剛一天也剛不掉,我們換個思路,用f i j 表示第i張卡被遍歷j次的概率。這個概率可以分為兩部分 1 第i 1張卡被遍歷j次且一直沒發動。這一段公式為f i 1 j 1...