硬币投掷实验c语言程序设计,投掷硬币(动态规划)
#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
AC code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXN 1000010
#define EPS 1e-9
using namespace std;
double pi[1010],dp[1001][1001];
int n,m;
int main()
{
//freopen(“D:\\in.txt”,”r”,stdin);
int i,j;
while(scanf(“%d%d”,&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf(“%lf”,&pi[i]);
}
memset(dp,0,sizeof(dp));
dp[1][1]=pi[1];
dp[1][0]=1-pi[1];
for(i=2;i<=n;i++)
{
dp[i][0]=dp[i-1][0]*(1-pi[i]);
}
for(i=2;i<=n;i++)
{
for(j=1;j<=i;j++)
{
dp[i][j]=dp[i-1][j]*(1-pi[i])+dp[i-1][j-1]*pi[i];
}
}
printf(“%lf\n”,dp[n][m]);
}
return 0;
}
还没有评论,来说两句吧...