码迷,mamicode.com
首页 > 其他好文 > 详细

plw的骰子

时间:2019-01-20 23:31:28      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:分析   有一个   浮点数   整数   sum   一个   正整数   [1]   http   

链接

[http://murphyc.fun/problem/4007]

题意

描述

duxing2016有一个神奇的骰子,投出1-6的概率为(p1,p2...p6)

现在他投n次骰子,问投出点数和大于等于m的概率是多少

输入

第一行,两个正整数n,m

第二行,六个浮点数 p1,p2,p3,p4,p5,p6

n <= 1000, n <= m <= 6 * n

0<=pi<=1, (p1+p2+p3+p4+p5+p6) = 1

输出

投出点数和大于m的概率p,你的答案与std的误差要<=1e-5

输入样例 1

2 7
0 0 0.5 0 0 0.5
输出样例 1

0.75

分析

就是基础的dp
dp[i][j]表示扔i和是j的概率
状态转移方程为
dp[i][j+k]=dp[i][j+k]+dp[i-1][k]*p[j];
刚开始时for(int i=1;i<=6;i++)
cin>>p[i],dp[1][i]=p[i];
dp[1][0]=1;
边界条件就是这个
最后在统计扔n次,得到大于等于m的概率和

代码

#include<iostream>
#include<stdio.h>
using namespace std;
double p[7];
int n,m;
double dp[1010][6010]; 
int main(){
    cin>>n>>m;
    for(int i=1;i<=6;i++)
    cin>>p[i],dp[1][i]=p[i];
    dp[1][0]=1;
    for(int i=2;i<=n;i++)
    for(int j=1;j<=6;j++)
    for(int k=(i-1);k<=6*(i-1);k++)
    dp[i][j+k]=dp[i][j+k]+dp[i-1][k]*p[j];
    double sum=0;
    for(int i=6*n;i>=m;i--)
    sum+=dp[n][i];
    printf("%.5f\n",sum);
    return 0;
}

plw的骰子

标签:分析   有一个   浮点数   整数   sum   一个   正整数   [1]   http   

原文地址:https://www.cnblogs.com/mch5201314/p/10296505.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!