HDU 3076 ssworld VS DDD 概率DP
来源:互联网 发布:淘宝助理如何加水印 编辑:程序博客网 时间:2024/05/01 03:23
/*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,0,sizeof(d1)); memset(d2,0,sizeof(d2)); memset(gl,0,sizeof(gl)); memset(dp,0,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); }}