[算法][动态规划][腾讯面试手撕题]抛硬币问题

2023-12-01 05:58

本文主要是介绍[算法][动态规划][腾讯面试手撕题]抛硬币问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

① 题目描述

有一些不规则的硬币。在这些硬币中, p i − 1 p_{i-1} pi1表示第 i i i枚硬币正面朝上的概率( i i i从1起)。
请对每一枚硬币抛掷一次,然后返回正面朝上的硬币数等于 t a r g e t target target的概率。

② 问题求解

误区:这题容易被排列组合的想法先入为主,其实这是一个动态规划的问题。

1 动态方程

d p [ i ] [ j ] dp[i][j] dp[i][j]为抛第 i i i个硬币时恰好有 j j j个朝上的概率,则:

d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ∗ ( 1 − p i − 1 ) + d p [ i − 1 ] [ j − 1 ] ∗ p i dp[i][j]=dp[i-1][j]*(1-p_{i-1}) +dp[i-1][j-1]*p_i dp[i][j]=dp[i1][j](1pi1)+dp[i1][j1]pi

反向迭代可以去除 i i i的维度,将空间优化为:

d p [ j ] = d p [ j ] ∗ ( 1 − p i − 1 ) + d p [ j − 1 ] ∗ p i dp[j]=dp[j]*(1-p_{i-1}) +dp[j-1]*p_i dp[j]=dp[j](1pi1)+dp[j1]pi

其中, d p [ j ] dp[j] dp[j]为恰有 j j j个硬币朝上的概率。

2 代码求解

"""
思路:动态规划 res[x]指的是恰好x个为正的概率@See 动态规划 https://leetcode-cn.com/tag/dynamic-programming/
样例输入:prob = [0.4], target = 1prob = [0.5,0.5,0.5,0.5,0.5], target = 0
样例输出:0.40000.03125
"""
from typing import Listclass Solution:def cal_probability(self, prob: List[float], target: int) -> float:res = [0 for _ in range(len(prob) + 1)]res[0] = 1.0for i in range(1, len(prob)+1):for j in range(min(i, target), -1, -1):# 恰好j个为正 = 上一轮更新中j个正面的情况下第i个恰好为反 + 已经j-1个正面的情况下第i个继续为正res[j] = (res[j] * (1 - prob[i - 1])) + ((res[j - 1] * prob[i - 1]) if j > 0 else 0)return res[target]

这篇关于[算法][动态规划][腾讯面试手撕题]抛硬币问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/440066

相关文章

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

Java 中的跨域问题解决方法

《Java中的跨域问题解决方法》跨域问题本质上是浏览器的一种安全机制,与Java本身无关,但Java后端开发者需要理解其来源以便正确解决,下面给大家介绍Java中的跨域问题解决方法,感兴趣的朋友一起... 目录1、Java 中跨域问题的来源1.1. 浏览器同源策略(Same-Origin Policy)1.

如何清理MySQL中的binlog问题

《如何清理MySQL中的binlog问题》:本文主要介绍清理MySQL中的binlog问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目http://www.chinasem.cn录清理mysql中的binlog1.查看binlog过期时间2. 修改binlog过期