描述
在一个星期三的早上,某同学想用扔硬币的方式来决定是否要去上算法课。
他扔 n 次硬币,如果当中有连续 m 次以上(含 m 次)的结果都是正面,那么他就去上课,否则就接着睡觉。(假设每次扔硬币扔出的正反两面的概率都是 0.5。)
- 输入
-
输入的每行有一组数据,分别为 n 和 m (0 < n <= 2000, 0 < m <= 10)。输入以 0 0 结尾。
- 输出
-
对于每组数据,输出他去上课的概率,四舍五入保留小数点后 2 位。
今天队友问我这个题,说是dp的问题。悲摧的开始看错题意了,题目让找连续m次以上的概率。开始思路是建立一个2维dp[i][j],表示仍i次硬币出现j次连续正面朝上的概率。但后来发现实现不了。问大牛说可以用自动机dp做,表示我从来没有看过自动机。后来看了解题报告,我晕,原来只要一个一维的数组dp[i]表示仍i次出现连续m个正面的概率。
当第i-1次时已经出现过连续m次,则dp[i] = dp[i-1];
当前边出现连续的m-1次正面,第m个正面出现在i位置时,从i-1到i-m都是正面,所以第i-m-1位置为反面,i-m-1之前的出现m个连续串的概率为dp[i-m-1],既得,不出现连续m的概率为1-dp[i-m-1];
所以,状态转移方程为 dp[i] = dp[i-1] + (1-dp[i-m-1]*0.5^(m+1));
当然,可以考虑一下集中特殊情况,不过对这个公式没有影响。
ps:dp还是太水了,随便一道题都可以虐我。。。。T_T,过段时间系统的看一看dp,包括算法+黑书+各种资料。