加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

HDU 3076 ssworld VS DDD 概率DP

发布时间:2020-12-14 05:32:17 所属栏目:百科 来源:网络整理
导读:/*dp概率水水的..注意边界处理注意把平局的情况去掉。。因为题目说了比赛一定会结束的。所以不存在平局的情况。hdu数据错了(还好discuss里有人说)。。。。m,n输入要交换。。。。*/#includeiostream#includecstring#includecstdiousing namespace std;int n,m
/*
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("%.6lfn",ans);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读