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);    }}


原创粉丝点击