掷骰子

来源:互联网 发布:java中for循环 编辑:程序博客网 时间:2024/05/16 11:40

掷骰子

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
小明有m个骰子,小红有n个骰子。每一个骰子都是标准六面骰子。他们分别掷出自己的骰子,如果小明的点数和大,则小明胜;否则小红胜。求小明胜利的概率。
输入
有T组数据。每组数据一行,m和n,用空格隔开。1 <= m, n <= 10
输出
对于每一组数据,输出小明获胜的概率。每组输出占一行,用四舍五入法,精确到小数点后面6位。
样例输入
11 1 
样例输出
0.416667

思路:

筛子的加深, 遍历所有dp结果用公式求结果打表。

//公式:ans[i][j] = sum(dp[i][m]+dp[j][n])/(6^i * 6^j)[m > n].#include <stdio.h>#include <math.h>int  dp[11][61];double ans[11][11];int getans(){    int i, j, k, l;    double sum;    for(i = 1; i < 7; i++)    {        dp[1][i] = 1;    }    for(i = 2; i < 11; i++)                    //此处求dp和筛子一样(递推)    {        for(j = i; j <= i*6 && j <= 60; j++)        {            for(k = 1; k <= 6; k++)            {                if(j-k > 0)                {                    dp[i][j] += dp[i-1][j-k];                }            }        }    }    for(i = 1; i < 11; i++)    {        for(j = 1; j < 11; j++)        {            sum = 0.0;            for(k = 60; k >= 1; k--)      //编译所有可能数, 用公式求解ans[i][j]放结果            {                for(l = 1; l < k; l++)                {                    sum += (dp[i][k] * 1.0 * dp[j][l]);                }            }            ans[i][j] = sum / (pow(6.0, i*1.0)*pow(6.0, j*1.0));        }    }    return 0;}int main(){    int n, m, t;    getans();    scanf("%d", &t);    while(t--)    {        scanf("%d%d", &n, &m);        printf("%.6lf\n", ans[n][m]);    }    return 0;}


0 0
原创粉丝点击