微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HDU 3076 ssworld VS DDD 概率DP

/*
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] 举报,一经查实,本站将立刻删除。

相关推荐