題意:
A,B擲骰子,對於每一次點數大者勝,平為和,A先勝了m次A贏,B先勝了n次B贏。
題解:
先將平局情況處理出來,讓他們一定要分出勝負,對於每一次p1表示A贏,p2表示B贏,p=1-p1-p2表示平局,所以在不死不休的情況下,A贏的機率為p1+p*p1+p^2*p1+...p^n*p1,n->無窮,即a_win=q1/(1-p);b_win=q2/(1-p);
然後在他們一定會分出勝負的情況下就可以dp了:
dp[i][j]=dp[i][j-1]*a_win+dp[i-1][j]*b_win;
dp[i][j]表示A勝j次,B勝i次的機率。
#include<iostream><br />using namespace std;<br />#define MAXN 2005<br />double dp[MAXN][MAXN];<br />double a[7],b[7];<br />double a_win,b_win;<br />double ans;<br />int main()<br />{<br /> int n,m,i,j;<br /> double p,p1,p2;<br /> while(scanf("%d %d",&m,&n)!=EOF)<br /> {<br /> for(i=1;i<=6;i++)<br /> scanf("%lf",&a[i]);<br /> for(i=1;i<=6;i++)<br /> scanf("%lf",&b[i]);<br /> a_win=0;<br /> for(i=2;i<=6;i++)<br /> {<br /> for(j=1;j<=i-1;j++)<br /> a_win+=a[i]*b[j];<br /> }<br /> b_win=0;<br /> for(i=2;i<=6;i++)<br /> {<br /> for(j=1;j<=i-1;j++)<br /> b_win+=b[i]*a[j];<br /> }<br /> p1=a_win;p2=b_win;p=1-a_win-b_win;<br /> if (p==1) {a_win=0;b_win=0;}<br /> else<br /> {<br /> a_win=p1/(1-p);<br /> b_win=p2/(1-p);<br /> }<br /> for(i=0;i<=n;i++)<br /> for(j=0;j<=m;j++)<br /> dp[i][j]=0;<br /> // cout<<a_win<<' '<<b_win<<endl;<br /> dp[0][0]=1;<br /> for(j=0;j<=m-1;j++)<br /> for(i=0;i<=n;i++)<br /> if (i+j!=0)<br /> {<br /> dp[i][j]=0;<br /> if (j>0)<br /> dp[i][j]+=dp[i][j-1]*a_win;<br /> if (i>0)<br /> dp[i][j]+=dp[i-1][j]*b_win;<br /> }<br /> ans=0;<br /> for(i=0;i<=n-1;i++)<br /> ans+=dp[i][m-1]*a_win;<br /> if (ans>1) ans=1;<br /> printf("%.6lf/n",ans);<br /> }<br />}<br />