dp求数学期望时往往是在上一个状态求完期望后,加上新状态的要求再求期望,但每次求dp时所乘的所有概率要等于1
https://www.cnblogs.com/hua-dong/p/8166093.html
- 数学期望 P=Σ每一种状态*对应的概率。
- 因为不可能枚举完所有的状态,有时也不可能枚举完,比如抛硬币,有可能一直是正面,etc。在没有接触数学期望时看到数学期望的题可能会觉得很阔怕(因为我高中就是这么认为的,对不起何老板了QwQ),避之不及。 但是现在发现大多数题就是手动找公式或者DP推出即可,只要处理好边界,然后写好方程,代码超级简短。与常规的求解不同,数学期望经常逆向推出。
- 比如常规的dp[x]可能表示到了x这一状态有多少,最后答案是dp[n]。而数学期望的dp[x]一般表示到了x这一状态还差多少,最后答案是dp[0]。
- 经典的期望dp
-
题目大意
一个N面骰子,问把每一面都至少掷出一次期望次数是多少?
input
2
1
12
output
1.00
37.24
idea
一开始的时候,一直在想扔出一面的期望是1,扔出两面的期望是(1 - 1/n) * 2, 扔出三面的期望是(1 - 2 / n) * 3 ….试了试样例,发现不对。
正确的应该是4/4 + 4/3 + 4/2 + 4/1,假设n是4的话。
首先扔第一面的时候,是1这个没有问题。
扔第二面的时候,期望是3/4,因为对于第二次扔,可能1次扔中,2次扔中,3次扔中…无穷多次扔中。
这个时候的期望就是(1 + 1/4 + 1/4 * 1/4 + 1/4 * 1/4 * 1/4 + …) 其实这里的每一项都是1/4 * 1 * 1/4 * 1 * 1/4 * 1的,好好理解一下,然后这个就是等比级数。
等比级数的求和公式:
当| r | < 1 时,limx→∞ Sn = a1 / (1 - r) 此时等比级数收敛。
所以最终结果就是∑(n / i)
上面是理性推出来的做法
看了另一种做法就是概率dp,发现这个东西真的好厉害的
我觉得对于这种可以做无穷多次的,就是要想到这种dp的思想
dp[i]表示已经有了i种需要有的状态推到最终状态需要的期望次数,即求扔出(n-i)个面时的期望
很显然dp[n] = 0。
然后开始逆推。对于当前的状态,如果在做一次操作,要么保持原有的状态dp[i],这种概率是i/n,要么出现新的一种状态,这种概率是(n - i) / n.
dp[i] = i / n * (dp[i] + 1) + (n - i) / n * (dp[i + 1] + 1); //在扔了i个面的基础上再扔一次 比dp[i+1]还要再多扔出一个面.又由于选第i个数后再选一个数与已经选过的数不同的概率为(n−i)/n,相同为i/n
化简下就ok,dp[0]就是答案。
---------------------
作者:deerly_
来源:CSDN
原文:https://blog.csdn.net/deerly_/article/details/82708680
版权声明:本文为博主原创文章,转载请附上博文链接!