有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 raw1 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; }
|