0%

骰子游戏

有A,B两个人分别有n,m的血量,每轮都扔筛子,点数小的扣一滴血。某人的血量扣到0就输了。已知两个人扔出每个点的概率。求最后A赢的概率。

输入描述:

第一行两个整数n和m,表示A和B的初始血量(n,m≤1000)。
接下来一行6个浮点数,表示A掷出1-6点的概率。
接下来一行6个浮点数,表示B掷出1-6点的概率。

输出描述:

A赢的概率。保留六位小数。

示例1
输入

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

输出

0.000000

示例2
输入

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

输出

1.000000

saiziyouxi.cppview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
using namespace std;
double dp[2005][2005],A[10],B[10],p,q;
double dfs(int x,int y) {
if(y==0)return 1.0;
if(x==0)return 0;
if(dp[x][y]>-1.0)return dp[x][y];
return dp[x][y]=dfs(x-1,y)*q+dfs(x,y-1)*p;
}
int solve() {
int n,m;
cin>>n>>m;
for(int i=1; i<=6; i++)scanf("%lf",&A[i]);
for(int i=1; i<=6; i++)scanf("%lf",&B[i]);
p=0,q=0;
for(int i=1; i<=6; i++)
for(int j=1; j<=6; j++) {
if(i>j)p+=A[i]*B[j];
else if(i<j)q+=A[i]*B[j];
}
double s=p+q;
p/=s,q/=s;
for(int i=0; i<=n; i++)
for(int j=0; j<=m; j++)dp[i][j]=-1;
double tmp=dfs(n,m);
printf("%.6f\n",tmp);
return 0;
}
int main() {
solve();
return 0;
}