计数头 - 动态编程

时间:2012-10-27 11:29:45

标签: algorithm dynamic-programming recurrence

问题:

  

给定整数n和k,以及p1,p2,..., pn; where pi ε [0, 1],你想确定当k偏置硬币随机独立抛出时获得正好n个头的概率,其中p i 是i th 硬币出现的概率。为此任务提供O(n 2 )算法。假设您可以在O(1)时间内在[0,1]中相乘和相加两个数字。

有人可以帮助我开发递归关系,以便我可以对其进行编码。 (问题来自于动态编程章节的背面练习“Algorithms by Dasgupta”)

1 个答案:

答案 0 :(得分:12)

考虑将(n-1)个硬币扔在一起并将第n个硬币分开并考虑相互独立的情况。

结合更简单案例的概率得到P(1..n,k)(其中P(1..n,k)是n个硬币时获得正好k头的概率)

然后应用此规则并填写NxK表中的所有单元格

修改

有两种方法可以准确地获得n个硬币的k头 -

a)如果(n-1)个硬币有k个头,第N个硬币是尾部,并且

b)如果(n-1)个硬币有k-1个头,第N个硬币是头

所以

P(n,k)= P(n-1,k)*(1 - p [n])+ P(n-1,k-1)* p [n]