剖析一道拼多多的笔试算法题

微信公众号:Jerry的算法和NLP

题目 掷骰子

掷n个不同面数的骰子,以最大点数为结果,求点数的期望。

一共有n个骰子

第i个骰子面数为ni,点数为[1,ni],每个面的概率相同

同时掷这n个骰子,所有骰子中的最大点数为最终点数

求骰子投出的期望值

examlple1

输入

2
2 2

输出

1.75

examlple2

输入

4
1 2 3 4

输出

2.875

分析:

这道题目主要考察的知识点为动态规划

动态规划主要就是要找准它的转移方程和base case以及目标

首先把所有骰子的输入放入xi数组中并且进行排序(倒序 从大到小)

然后建立两个列表

一个是res 存放最终的结果

一个是current 存放遍历到当前骰子的结果

1.先拿出第一个骰子 计算第一个骰子中发生每一个可能点数的概率并存入res和current中 【规定起始状态】

2.开始遍历每一个骰子 我们把当前的骰子记作P

   首先先是计算P这个骰子每一面会发生的概率 就是1/P

    P这个骰子在转的时候  假设最后所有骰子的点数为Q

A .之前的骰子都是<Q * P这个骰子投出了Q

B .之前的骰子刚好出现Q * P这个骰子没投注Q

C .之前的骰子出现Q * 这个骰子投出了Q

3.最后把每个点数 * 概率 求出期望值

举个例子,,方便大家理解

假设现在有三个骰子

分别为2 3 4 存入X中

先将X排倒序 X=【4,3,2】

说明最多有四种情况 1,2,3,4

然后一开始初始化的时候是选择骰子面数最多的4

此时res=[0,1/4,1/4,1/4,1/4]

current=[0,1/4,1/4,1/4,1/4]

然后从第二个骰子开始遍历到第N个骰子

现在第二个骰子是3 

投出1,2,3的概率都是1/3

基于第一个骰子的基础上 投出第二个骰子

那么最后结果为X的可能性由以下三个方面组成

1.之前的骰子投出的结果<X的概率 乘以 当前骰子投出X的概率

      a=sum(res[:j])*(1/xi[i])

(之前出现1,2,3,...,X-1的概率 * 当前出现X的概率)

2.之前骰子投出结果=X的概率 乘以 当前骰子投出<X的概率

       b=res[j]*((j-1)/xi[i]

  (之前恰好是X * 当前出现1,2,3,...,X-1的概率)

3.之前骰子投出X  乘以 当前骰子投出X的概率

        c=res[j]*(1/xi[i])

 (之前恰好是X 且当前也是X)

把三种情况的概率相加a+b+c赋值给current[i] 然后用current更新res即可

总结

 1n=int(input())
 2xi=list(map(int,input().split()))
 3xi.sort(reverse=True)
 4res=[0]
 5current=[0]
 6for i in range(xi[0]):
 7    res.append(1/xi[0])
 8    current.append(1/xi[0])
 9
10
11for i in range(1,n):
12    for j in range(1,xi[i]+1):
13        print(res)
14        a=sum(res[:j])*(1/xi[i])#之前的骰子投出的结果<X的概率乘以当前骰子投出X的概率
15        b=res[j]*((j-1)/xi[i])#之前骰子投出结果=X的概率乘以当前骰子投出<X的概率
16        c=res[j]*(1/xi[i])#之前骰子投出X 乘以 当前骰子投出X的概率
17        print("a,b,c=",a,b,c)#三者相加为最终点数为j的概率
18        current[j]=a+b+c
19    for i in range(1,xi[i]+1):
20        res[i]=current[i]#更新res
21ac=0
22for i in range(1,len(res)):
23    ac+=i*res[i]#求期望
24print(ac)

剑指offer刷题交流群

  扫码添加微信,一定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆),只有备注正确才可以加群噢。

 ▲长按加群

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值