【hihocoder #1506 : 投掷硬币】递推

2024-08-27 01:58

本文主要是介绍【hihocoder #1506 : 投掷硬币】递推,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【链接】:hihocoder #1506 : 投掷硬币
【题目】:
1506 : 投掷硬币
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi有一枚神奇的硬币。已知第i次投掷这枚硬币时,正面向上的概率是Pi。

现在小Hi想知道如果总共投掷N次,其中恰好M次正面向上的概率是多少。

输入
第一行包含两个整数N和M。

第二行包含N个实数P1, P2, … PN。

对于30%的数据,1 <= N <= 20

对于100%的数据,1 <= N <= 1000, 0 <= M <= N, 0 <= Pi <= 1

输出
输出一行一个实数表示恰好M次正面向上的概率。注意行末需要包含一个换行符’\n’。

输出与标准答案误差在0.001以内都被视为正确。

样例输入
2 1
0.5 0.5
样例输出
0.500000
【思路】:见代码
【代码】:


/*********************************
*   Date:    2017-04-16 12:00
*   Author:  herongwei
*   Problem:  投掷硬币
*   Source:  https://hihocoder.com/problemset/problem/1506
*   Result:  AC 
*   Language: G++
*********************************
描述
小Hi有一枚神奇的硬币。已知第i次投掷这枚硬币时,正面向上的概率是Pi。现在小Hi想知道如果总共投掷N次,其中恰好M次正面向上的概率是多少。输入
第一行包含两个整数N和M。第二行包含N个实数P1, P2, ... PN。对于30%的数据,1 <= N <= 20对于100%的数据,1 <= N <= 1000, 0 <= M <= N, 0 <= Pi <= 1输出
输出一行一个实数表示恰好M次正面向上的概率。注意行末需要包含一个换行符'\n'。输出与标准答案误差在0.001以内都被视为正确。样例输入
2 1
0.5 0.5
样例输出
0.500000
*/
#pragma comment(linker,"/STACK:102400000,102400000")
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <set>
#include <stack>
#include <math.h>
#include <map>
#include <queue>
#include <deque>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
const int maxm = 55;
const LL MOD = 999999997;
int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
inline int read()
{int  c=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}return c*f;
}
double dp[1050][1050];
int main()
{//freopen("in2.txt", "r", stdin);int n,m;while(scanf("%d%d",&n,&m)!=EOF){dp[0][0]=1.0; ///dp[i][j] 表示硬币投掷n次恰好m次正面朝上概率for(int i=0; i<n; ++i)///枚举投掷n次{double p; ///第i次投掷这枚硬币时,正面向上的概率是Piscanf("%lf",&p);for(int j=0; j<=i; ++j) ///枚举前i次硬币正面朝上状态{dp[i+1][j]+=dp[i][j]*(1.0-p); ///投掷i+1次j次正面朝上的概率=当前概率+投掷i次j次正面朝上概率dp[i+1][j+1]+=dp[i][j]*p;///投掷i+1次j+1次正面朝上的概率=当前概率+投掷i次j次正面朝上的概率}} printf("%.6f\n",dp[n][m]); ///硬币投掷n次恰好m次正面朝上概率}return 0;
}

这篇关于【hihocoder #1506 : 投掷硬币】递推的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110308

相关文章

uva 568 Just the Facts(n!打表递推)

题意是求n!的末尾第一个不为0的数字。 不用大数,特别的处理。 代码: #include <stdio.h>const int maxn = 10000 + 1;int f[maxn];int main(){#ifdef LOCALfreopen("in.txt", "r", stdin);#endif // LOCALf[0] = 1;for (int i = 1; i <=

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

HLJUOJ1128 HDU2046(数学递推)

1128: 递推求解专题练习三 Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 8   Solved: 6 [ Submit][ Status][ Web Board] Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数。 例如n=3时,为2× 3方格,骨牌的铺放方案有三

【递推】【DP】-HDU-2064-汉诺塔③

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064 题目描述:从最左边移到最右边柱子的过程中必须经过中间柱子。 解题思路: 进ACM组时候的考试题,当时虐我的题终于被我虐回来了。。一眼看出方程,1A了。。。呵呵。。满足一下我的虚荣心,,,抚慰一下受挫的心灵吧。 AC代码: #include <iostream>using names

【递推】【DP】-HDU-1996-汉诺塔⑥

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1996 题目描述:问三个柱子上放N个盘子,一共可能有多少种组合?(可以有柱子不放,放的时候依然满足下面盘子比上面盘子大) 解题思路: 对于放N个盘子,ans [ N ] = 3 + 6 * f ( N ) +6 * g ( N ) 这三项依次代表这N个盘子分成一堆,两堆,三堆时有多少种可能。排列

【递推】【DP】-HDU-1995-汉诺塔⑤

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 题目描述:计算汉诺塔中某个盘子的移动次数 解题思路: 想了好久,突然顿悟! 思路如下,所谓递推,即是前者与后者存在直接联系,由前者可以直接推出后者,因此必须有一端是已知的,这题里显然最下面的盘子只被动了一次,这就是开端,然后我们考虑紧挨着的两张盘子的递推关系,发现上面盘子是紧挨着的下面盘

【递推】【DP】-HDU-1207-汉诺塔②

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207 题目描述:四柱汉诺塔 解题思路: 开始想了方程 f [ n ] = 2 * f [n - 2] + 3和 f [ n ] = 2 * f [n - 3] + 7。结果都不对,很郁闷,纠结半天之后,上网查攻略去了,啊!我就差一点了,但也是差了最为关键的一步! 正确的方程应该是: f [

蓝桥杯备赛day02:递推

斐波那契数列 #include <bits/stdc++.h>using namespace std;int main(){int n;cin>>n;int dp[n+1];dp[1]=1;dp[2]=1;for(int i = 3;i <= n;i++) dp[i] = dp[i-1]+dp[i-2];cout<<dp[n];return 0;} n = int(input())

递推—杭电2044 一只小蜜蜂...

http://acm.hdu.edu.cn/showproblem.php?pid=2044 一只小蜜蜂... Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 35811    Accepted Submission(s): 1317

完全背包问题-leetcode-08.11. 硬币

问题描述https://leetcode-cn.com/problems/coin-lcci/ 面试题 08.11. 硬币 硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 等价 背包。给定数量物品,物品体积为25、10、5和1,编写代码背包体积为n,装物品的方法有多少种。(结果可能会很大,你