动态规划-概率dp

  • 链接:https://ac.nowcoder.com/acm/problem/23413

  • 小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富。已知购买一张彩票需要3元,而彩票中奖的金额分别为1,2,3,4元,并且比较独特的是这个彩票中奖的各种金额都是等可能的。现在小A连续购买了n张彩票,他希望你能够告诉他至少能够不亏本的概率是多少。

  • 题目分析dp[i][j]表示前i张彩票中奖的金额为j的方案数(概率dp中常见的状态方法),即转移方程

    dp[i][j] = dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4]

最后计算ans = sum(dp[n][i])(i>=3n&&i<=4n)即为不亏本的方案数,总方案数为4^n,最后输出ans/sum的最简分数几个

点击查看代码
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define mod 1e9+7
using namespace std;
ll dp[31][121]={0};//表示赚的数目

ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}

int main()
{
   // IOS
    dp[0][0]=1;
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=4*n;j++)
        {
            if(j-1>=0)
                dp[i][j]+=dp[i-1][j-1];
            if(j-2>=0)
                dp[i][j]+=dp[i-1][j-2];
            if(j-3>=0)
                dp[i][j]+=dp[i-1][j-3];
            if(j-4>=0)
                dp[i][j]+=dp[i-1][j-4];
        }
    }
    ll a=0;
    for(int i=n*3;i<=121;i++)
        a+=dp[n][i];
    ll b=pow(4,n);
    ll c=a/gcd(a,b);
    ll d=b/gcd(a,b);
    printf("%lld/%lld\n",c,d);
    return 0;
}
posted @   重生之我是菜鸟  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示