《CSDN周赛—第29期》竞赛糖豆问题Python&Matlab代码

目录

题目内容

解题思路

步骤

题目内容

小Q与小K都喜欢吃糖豆。 但是糖豆分两种,超甜糖豆和普通糖豆。 现在有w(>=0)个超甜糖豆和b(>=0)个普通糖豆。 小Q和小K开始吃糖豆,他们决定谁先吃到超甜糖豆谁就获胜。 小K每次吃的时候会捏碎一颗糖豆。 小Q先吃,小Q想知道自己获胜的概率。 如果两个人都吃不到超甜糖豆小K获胜。(结果保留9位小数)


解题思路

利用递推关系


步骤

1.导出递推式

设(m,n)情况下小Q获胜的概率为p(m,n)

#小Q第一次就吃到:m/(m+n)
#小Q第一次没吃到:
#(1)小K捏碎了超甜的然后吃甜的:n/(m+n)*m/(m+n-1)*(n-1)/(m+n-2)*p(m-1,n-2)
#(2)小K捏碎了超甜的然后吃甜的:n/(m+n)*(n-1)/(m+n-1)*(n-2)/(m+n-2)*p(m,n-3)
#由此知递推式:
p(m,n)=m/(m+n)+n/(m+n)*(m/(m+n-1)*(n-1)/(m+n-2)*p(m-1,n-2)+\
                            (n-1)/(m+n-1)*(n-2)/(m+n-2)*p(m,n-3))

2.研究递推式的限制条件,补充空白区域的实现

观察递推式:发现 (m=0,n),(m,n=0),(m,n=1),(m,n=2)需要补充(不能利用上面得到的递推式)

def p(m,n):
    if m==0:
        return 0
    elif n==0:
        return 1
    elif n==1:
        return m/(m+n)
    elif n==2:
        return m/(m+2)+2/(m+2)*m/(m+1)/m

完整代码如下:

x=float(input())
y=float(input())
def p(m,n):
    if m==0:
        return 0
    elif n==0:
        return 1
    elif n==1:
        return m/(m+n)
    elif n==2:
        return m/(m+2)+2/(m+2)*m/(m+1)/m
    else:
        return m/(m+n)+n/(m+n)*(m/(m+n-1)*(n-1)/(m+n-2)*p(m-1,n-2)+\
                            (n-1)/(m+n-1)*(n-2)/(m+n-2)*p(m,n-3))
print('%.9f'%(p(x,y)))

    
    

Matlab代码:


function [r] = p(m,n)
if m==0
    r=0;
elseif n==0
    r=1;
elseif n==1
    r=m/(m+2);
elseif n==2
    r=m/(m+2)+2/(m+2)*m/(m+1)/m;
else
    r=m/(m+n)+n/(m+n)*(m/(m+n-1)*(n-1)/(m+n-2)*p(m-1,n-2)+...
        (n-1)/(m+n-1)*(n-2)/(m+n-2)*p(m,n-3));
end

x=input('');
y=input('');
a=p(x,y);
digits(9) 
b=vpa(a)

关于matlab里面如何保留小数特定位数参见:matlab如何保留指定小数位数

你可能感兴趣的:(python,matlab)