#include <stdio.h>//注意题意,是从第一个人先胜的常熟的=第二个人的hp时,才赢.所以n和m应该反过来枚举 #include <cstring> #define maxn 2001 double dp[maxn][maxn]; double a[6]; double b[6]; int main() { int n,m; while(scanf("%d%d",&n,&m)==2) { for(int i=1; i<=6; i++) scanf("%lf",&a[i]); for(int i=1; i<=6; i++) scanf("%lf",&b[i]); double aa=0,bb=0; //枚举所有的a>b的可能性用独立原理求每一次a,b胜出的概率 for(int i=2; i<=6; i++) for(int j=1; j<i; j++) { aa+=a[i]*b[j]; bb+=b[i]*a[j]; } double p=1-aa-bb; if(p==1) aa=bb=0; else { aa=aa/(1-p); bb=bb/(1-p); } memset(dp,sizeof(dp)); dp[0][0]=1;//该情况初始时必然发生 for(int i=0; i<=m; i++) for(int j=0; j<=n; j++) { //dp[i][j]=aa*dp[i-1][j]+bb*dp[i][j-1];dp过程中要注意下标可能越界时要分裂处理,如下. if(i||j) { dp[i][j]=0; if(i) dp[i][j]+=dp[i-1][j]*aa; if(j) dp[i][j]+=dp[i][j-1]*bb; } } double ans=0; for(int i=0; i<=n-1; i++)//i不能枚举到n.否则相平. ans+=dp[m-1][i]*aa;//m-1*aa是第m场. if(ans>1) ans=1; printf("%.6lf\n",ans); } return 0; }
原文地址:https://www.jb51.cc/javaschema/286681.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。