/* dp概率水水的.. 注意边界处理 注意把平局的情况去掉。。因为题目说了比赛一定会结束的。所以不存在平局的情况。 hdu数据错了(还好discuss里有人说)。。。。m,n输入要交换。。。。 */ #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m; double d1[7],d2[7],x; double gl[3]; double dp[2005][2005]; void getGl()//分别算出算出赢 输,平的概率 { for(int i=1;i<=5;i++) { gl[0]+=d1[i]*(d2[i+1]-d2[i]); } for(int i=1;i<=5;i++) { gl[2]+=d2[i]*(d1[i+1]-d1[i]); } gl[1]=1-gl[0]-gl[2];//平的概率 gl[0]=gl[0]/(1-gl[1]);//没有平局的情况下赢的概率 gl[2]=gl[2]/(1-gl[1]);//输 } int main() { //freopen("test.txt","r",stdin); while(scanf("%d%d",&m,&n)!=EOF)//换过了 { memset(d1,sizeof(d1)); memset(d2,sizeof(d2)); memset(gl,sizeof(gl)); memset(dp,sizeof(dp)); for(int i=1;i<=6;i++) { scanf("%lf",&d1[i]); d1[i]+=d1[i-1]; } for(int i=1;i<=6;i++) { scanf("%lf",&d2[i]); d2[i]+=d2[i-1]; } getGl(); dp[n][m]=1; for(int i=n;i>=0;i--) { for(int j=m;j>=0;j--) { if(i==n&&j==m) continue; if(gl[1]==1) continue; if(i!=0&&j+1<=m)//有一方为0就不能推了 dp[i][j]+=dp[i][j+1]*gl[2]; if(j!=0&&i+1<=n)//有一方为0就不能推了 { dp[i][j]+=dp[i+1][j]*gl[0]; } } } double ans=0; for(int i=n;i>=1;i--) ans+=dp[i][0]; printf("%.6lf\n",ans); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。