• 牛客练习赛26 B-烟花 (概率DP)


    链接:https://www.nowcoder.com/acm/contest/180/B
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    Special Judge, 64bit IO Format: %lld

    题目描述

    小a有个烟花,每个烟花代表着互不相同的颜色,对于第个烟花,它有的概率点燃,现在小a要去点燃它们,他想知道产生颜色的期望个数 及 产生恰好产生种颜色的概率

    输入描述:

    第一行两个整数

    接下来一行
    个数,第
    个数
    表示第
    个烟花被点燃的概率

    输出描述:

    输出有两行
    第一行表示产生不同颜色的期望个数
    第二行表示产生恰好种颜色的概率
    以换行符分割
     
    示例1

    输入

    复制
    3 2
    0.5 0.25 0.75

    输出

    复制
    1.5000
    0.4062

    说明

    第二问样例解释:

    相加得

    备注:

    对于
    的数据:

    对于
    的数据:

    输出均保留4位小数,若你的答案误差与std不超过
    即为正确
     
    分析:第一问由期望的定义可知期望为E=∑pi
    第二问,简单概率DP,令dp[i][j]为前i个烟花恰有j个被点燃,
    那么dp[i][j]=dp[i-1][j-1] * pi + dp[i-1][j] * (1-pi),其中dp[i-1][j-1] * pi 为第i个被点燃的概率,
    dp[i-1][j] * (1-pi)为第i个不被点燃的概率,最后初始化一下即可。
     
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    double p[100100];
    double dp[100100][300];
    int main()
    {
        int n,k;
        scanf("%d%d",&n,&k);
        double E=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%lf",&p[i]);
            E+=p[i];
        }
        dp[0][0]=1;
        for(int i=1;i<=n;i++)
        dp[i][0]=(1-p[i])*dp[i-1][0];//初始化
        for(int i=1;i<=n;i++)
            for(int j=1;j<=k;j++)
                dp[i][j]=dp[i-1][j-1]*p[i]+(1-p[i])*dp[i-1][j];
        printf("%.4lf
    %.4lf
    ",E,dp[n][k]);
        return 0;
    }
    View Code
     
     
     
  • 相关阅读:
    p1012拼数题解
    LeetCode OJ :Unique Binary Search Trees II(唯一二叉搜索树)
    UVA 11827 Maximum GCD
    LightOJ1336 Sigma Function(约数和为偶数的个数)
    LightOJ 1197 Help Hanzo(区间素数筛选)
    LightOJ 1236
    BZOJ3339 Rmq Problem
    COJ983 WZJ的数据结构(负十七)
    LCA的五种解法
    hdu4223(dp)
  • 原文地址:https://www.cnblogs.com/ACRykl/p/9608323.html
Copyright © 2020-2023  润新知