题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3076
5 5 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 5 5 0.000 0.000 0.000 0.000 0.000 1.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000000 1.000000
题意:
有A、B个人分别有H1 H2的血量,他们轮流的扔骰子,仍的点数小的减一血,
若仍的点数一样则都不变,谁先到减0, 谁输,问A赢的概率。
代码如下:
#include <cstdio>
#include <cstring>
double dp[2017][2017];
//dp[i][j]表示A胜j次,B胜i次的概率。
int main()
{
int n, m;
double a[7], b[7];
while(~scanf("%d%d",&m,&n))
{
memset(dp,0,sizeof(dp));
double p1 = 0, p2 = 0, p = 0;
//设p1,p2,p表示A赢,B赢,两者平局。
for(int i = 1; i <= 6; i++)
{
scanf("%lf",&a[i]);
}
for(int i = 1; i <= 6; i++)
{
scanf("%lf",&b[i]);
}
for(int i = 2; i <= 6; i++)//A赢
{
for(int j = 1; j < i; j++)
{
p1+=a[i]*b[j];
}
}
for(int j = 2; j <= 6; j++)//B赢
{
for(int i = 1; i < j; i++)
{
p2+=a[i]*b[j];
}
}
double w1, w2;
//w1,w2表示整个过程之中赢一局的概率
p = 1-p1-p2;
if(p == 1)
{
w1 = 0;
w2 = 0;
}
else
{
w1 = p1/(1-p);
w2 = p2/(1-p);
}
dp[0][0] = 1;
for(int j = 0; j < m; j++)
{
for(int i = 0; i <= n; i++)
{
if(j > 0)
dp[i][j]+=dp[i][j-1]*w1;
if(i > 0)
dp[i][j]+=dp[i-1][j]*w2;
}
}
double maxx = 0;
for(int i = 0; i < n; i++)
{
maxx+=dp[i][m-1]*w1;
}
printf("%.6lf\n",maxx);
}
return 0;
}
原文:http://blog.csdn.net/u012860063/article/details/40050165