Atcoder链接:Coins

Luogu链接:Coins


$\scr{\color{BlueViolet}{Solution}}$

观察数据,发现$ \cal{n} \le 3000 $,说明 $ Ο(\cal{n^2}) $可过,容易想到DP。

用 $\cal{dp[i][j]}$ 表示抛完第$\cal{i}$个硬币时,有$\cal{j}$个硬币正面朝上的概率。

考虑$\cal{dp[i][j]}$如何转移,易发现有以下两种情况,(当前正面朝上概率为 $\cal{p_i}$):

  • 本次抛得硬币是正面:抛到正面概率 乘 抛完第$\cal{i-1}$个硬币后,有$j-1$个硬币朝上的概率。
  • 本次抛得硬币是反面:抛到反面概率 乘 抛完第$\cal{i-1}$个硬币后,有$j$个硬币朝上的概率。

我们把以上两种情况表示出来,也就是:${dp[i][j]} = {p_i}  \times {dp[i-1][j-1]} + {1-p_i} \times {dp[i-1][j]}$

初始值:$\cal{dp[0][0]=1}$,因为第$0$次抽到$0$张卡的概率一定是$1$。

其余$dp[i][j]$值都为0。

然后就好了,最后统计一下符合条件的所有可能情况。

时间复杂度:$\cal{O(n^2)}$

Code:

#include<bits/stdc++.h>
#define L long long
using namespace std;
double a[3005];
double dp[3005][3005];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
dp[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
if(i==j) dp[i][j]+=dp[i-1][j-1]*a[i];
else if(j!=0) dp[i][j]+=dp[i-1][j-1]*a[i]+dp[i-1][j]*(1-a[i]);
else dp[i][j]+=dp[i-1][j]*(1-a[i]);
}
}
double summ=0;
for(int i=1;i<=n;i++)
if(i>n-i) summ+=dp[n][i];
printf("%.9lf",summ);
return 0;
}

Atcoder dp I Coins 题解的更多相关文章

  1. AtCoder Beginner Contest 184 题解

    AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...

  2. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  3. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  4. AtCoder Beginner Contest 173 题解

    AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...

  5. AtCoder Beginner Contest 169 题解

    AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...

  6. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  7. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  8. AtCoder Beginner Contest 172 题解

    AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...

  9. AtCoder Beginner Contest 148 题解

    目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...

  10. CodeChef-LECOINS Little Elephant and Colored Coins 题解

    CodeChef-LECOINS Little Elephant and Colored Coins Little Elephant and Colored Coins The Little Elep ...

随机推荐

  1. NLP之基于Transformer的句子翻译

    Transformer 目录 Transformer 1.理论 1.1 Model Structure 1.2 Multi-Head Attention & Scaled Dot-Produc ...

  2. 9.异步redis

    在使用Python代码操作redis时候,连接.操作.断开都是网络IO #安装支持异步redis的模块 pip3 install aioredis async def execute(address, ...

  3. Elasticsearch rest-high-level-client 基本操作

    Elasticsearch rest-high-level-client 基本操作 本篇主要讲解一下 rest-high-level-client 去操作 Elasticsearch , 虽然这个客户 ...

  4. Netty学习记录-入门篇

    你如果,缓缓把手举起来,举到顶,再突然张开五指,那恭喜你,你刚刚给自己放了个烟花. 模块介绍 netty-bio: 阻塞型网络通信demo. netty-nio: 引入channel(通道).buff ...

  5. calico和flannel的优缺点

    1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...

  6. 驱动开发:内核层InlineHook挂钩函数

    在上一章<驱动开发:内核LDE64引擎计算汇编长度>中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函 ...

  7. Codeforces Global Round 18 B. And It's Non-Zero(按位前缀和)

    题目大意:求一段数(l到r)的按位与结果不为零需要删除中间元素的最小个数 思路:按位与使得结果不为0只要有某一位全是1即可,所以只要统计每一位1的个数,用总个数减去1的个数就是某一位0的个数 删除包含 ...

  8. [排序算法] 简单选择排序 (C++)

    简单选择排序原理 简单选择排序 SelectSort 是一种十分直观地排序方法.其原理是每次从未排序的元素中找到当前最小的元素,放在当前未排序序列的首位.一直重复操作直至最后未排序的元素个数为 0,即 ...

  9. OSI传输层TCP与UDP协议、应用层简介、socket模块介绍及代码优化、半连接池的概念

    目录 传输层之TCP与UDP协议 应用层 socket模块 socket基本使用 代码优化 半连接池的概念 传输层之TCP与UDP协议 TCP与UDP都是用来规定通信方式的 通信的时候可以随心所欲的聊 ...

  10. extern "C"的使用

    在使用C++开发程序时,有时使用到别人开发的第三方库,而这第三库是使用C开发的.直接使用会报错如下: cpp error LNK2019: 无法解析的外部符号 "int __cdecl su ...