zoukankan      html  css  js  c++  java
  • HDU 3076:ssworld VS DDD

    ssworld VS DDD

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=3076

    题意:

    有两个人玩游戏,分别投骰子,谁的点数小谁掉一点血,两人分别有HP1、HP2点血(1≤HP1,HP2≤2000),给出两人分别掷出1~6的概率,求第一个人赢(也就是第二个人的HP掉到0了)的概率。

    题解:

    一道水题,但是直接写会超内存,模拟下滚动数组做,且这类题要注意一人的HP为0后游戏就结束了

                  

    代码

    #include<stdio.h>
    #include<string.h>
    const int N=2002;
    double dp[N],so[N];
    double A[7],B[7],AW,BW,res,SW;
    int main()
    {
      int n,m;
      while(~scanf("%d%d",&m,&n))
      {
        memset(dp,0,sizeof(dp));
        memset(so,0,sizeof(so));
        for(int i=1;i<=6;++i)
        scanf("%lf",&A[i]);
        for(int i=1;i<=6;++i)
        scanf("%lf",&B[i]);
        AW=BW=res=0;
        for(int i=2;i<=6;++i)
        for(int j=1;j<i;++j)
        AW+=A[i]*B[j];// AW是A的点数大,B掉血的概率
        for(int i=2;i<=6;++i)
        for(int j=1;j<i;++j)
        BW+=B[i]*A[j];
        SW=AW+BW;//SW是两人点数相同的概率
        AW=AW/SW;
        BW=BW/SW;
        dp[0]=1,so[0]=0;
        double res=0;
        for(int i=0;i<n;++i)
        {
          for(int j=0;j<=m;++j)
          {
            if(i>0&&j<m)dp[j]+=so[j]*BW;
            if(i<n&&j>0)dp[j]+=dp[j-1]*AW;
          }
          res+=dp[m];
          for(int j=0;j<=m;++j)
          so[j]=dp[j],dp[j]=0;
        }
        printf("%.6f ",res);
      }
    }

      

  • 相关阅读:
    兼容Linux和Windows下获取视频截图
    webSocket通信
    解决IE浏览器弹出下载框的问题
    jsp的九大内置对象和四大作用域(转)
    如何确定神经网络的层数和隐藏层神经元数量
    Mac 修改系统默认Java版本
    Weka的使用
    在Mac OS系统中安装oracle
    P & NP & NPC & NP-HARD
    Dynamic programming——自下而上 VS. 自上而下
  • 原文地址:https://www.cnblogs.com/kiuhghcsc/p/5550829.html
Copyright © 2011-2022 走看看