概率论——绿豆蛙的归宿+扑克牌

本文解析了两道AcWing题库中的题目,涉及概率期望与动态规划。第一题是计算绿豆蛙从起点到终点的期望路径长度,第二题则是计算抽牌游戏中获得特定组合的期望值。通过递推公式和记忆化搜索,展示了如何建立状态转移模型并求解最优化问题。
摘要由CSDN通过智能技术生成

传送门:217. 绿豆蛙的归宿 - AcWing题库

思路:首先对于期望有如下定义:

E(a*X+b*Y)=a*E(X)+b*E(Y),现在要求事件X和事件Y同时发生的期望是等于他们的分别发生的概率乘上对应事件的值,同时也可以转化为X事件的期望值乘上X事件发生的概率a加上Y事件的期望值乘上Y事件发生的概率b就是两件事同时发生的期望值。

原题要求路径长度的期望,定义f[i]为从i到N的期望路径长度,有f[N]=0,要求f[1]

假设现在有一个点i可以到达点s1,s2,s3,s4,则f[i]=1/4*(w1+f[s1])+1/4*(w2+f[s2])+1/4*(w3+f[s3])+1/4*(w4+f[s4]),这里可以发现,要求每个点的f[i]都要先知道出点的f[]值,可以按照拓扑序从后往前推,也可以用记忆化搜索。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1e5+10,M=2e5+10;
int n,m;
int h[N],e[M],ne[M],w[M],idx;
int dout[N];
double f[N];
void add(int a,int b,int c)
{
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
double  dp(int u)
{
    if(f[u]>=0) return f[u];
    f[u]=0;
    for(int i=h[u];~i;i=ne[i])
    {
        int j=e[i];
        f[u]+=(w[i]+dp(j))/dout[u];
    }
    return f[u];
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    for(int i=0;i<m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        dout[a]++;
    }
    memset(f,-1,sizeof f);

    printf("%.2lf",dp(1));
    return 0;
}

传送门:218. 扑克牌 - AcWing题库

思路:这道题需要像上面一样找到合理的状态定义和状态表示的一个转移图。

定义一个状态f[a][b][c][d][x][y]为取得a 张黑桃、b 张红桃、c 张梅花、d 张方块,以及大王小王的状态为x,y下的期望值,初始状态x,y置为4,a~d置为0,表示一张牌都没有的情况。

终点状态就是f[A][B][C][D][x][y]里面x,y的不同情况里面期望最小的一种。

要查看当牌堆里面还有多少张牌就是sum=54-(a-b-c-d-(x!=4)-(y!=4)),对于下一张牌的概率这里用黑桃做演示,就是(13-a)/sum,用剩余牌中黑桃的数量除剩余牌的数量,就是下一张牌是黑桃的概率,仅当黑桃还有牌在牌堆。

大小王的概率就是1/sum,仅当大小王还没被抽出来。

大小王抽出来用到四个花色得到的期望需要选出最大的一个类加回当前状态的期望中。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=14;
const double INF=1e20;
int A,B,C,D;
double f[N][N][N][N][5][5];
double dp(int a,int b,int c,int d,int x,int y)
{
    double &v=f[a][b][c][d][x][y];
    if(v>=0) return v;
    int as=a+(x==0)+(y==0);
    int bs=b+(x==1)+(y==1);
    int cs=c+(x==2)+(y==2);
    int ds=d+(x==3)+(y==3);
    if(as>=A&&bs>=B&&cs>=C&&ds>=D) return v=0;//当前状态已经是边界状态了

    int sum=a+b+c+d+(x!=4)+(y!=4);
    sum=54-sum;
    if(sum<=0) return v=INF;
    v=1;
    if(a<13) v+=(13.0-a)/sum*dp(a+1,b,c,d,x,y);
    if(b<13) v+=(13.0-b)/sum*dp(a,b+1,c,d,x,y);
    if(c<13) v+=(13.0-c)/sum*dp(a,b,c+1,d,x,y);
    if(d<13) v+=(13.0-d)/sum*dp(a,b,c,d+1,x,y);
    if(x==4) //当大小王还没被抽出来
    {
        double t=INF;
        for(int i=0;i<4;i++)
        t=min(t,1.0/sum*dp(a,b,c,d,i,y));
        v+=t;
    }
    if(y==4)
    {
        double t=INF;
        for(int i=0;i<4;i++)
        t=min(t,1.0/sum*dp(a,b,c,d,x,i));
        v+=t;
    }
    return v;
}
int main()
{
    cin>>A>>B>>C>>D;
    memset(f,-1,sizeof f);
    double t=dp(0,0,0,0,4,4);
    if(t>INF/2) t=-1;
    printf("%.3lf\n",t);
    return 0;
}

概率论中,先验概率是指根据以往经验和分析得到的概率,在"由因求果"问题中作为因出现。先验概率可以通过全概率公式等方法计算得到。而后验概率是指在已有结果的情况下,求引起这个结果的因素的可能性,即由果求因。后验概率可以通过贝叶斯定理计算得到。 关于保研复习资料,根据引用提供的资料,它是一份自己整理的保研概率论面试保研资料。这份资料可能包括了保研概率论的相关知识、面试常见问题和答案等内容。如果你对概率论的保研复习感兴趣,这份资料可能会对你有所帮助。但请注意,复习资料只是辅助工具,最重要的还是理解概率论的基本概念和原理,并进行大量的练习和实践。希望你能够努力学习,加油!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [概率论保研复习.pdf](https://download.csdn.net/download/Mikesuper_blog/12722360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [计算机保研复习](https://blog.csdn.net/dlz_yhn/article/details/126806194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [计算机保研专业课必备之数学](https://blog.csdn.net/qq_54117842/article/details/127927858)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值