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

  

原文地址:https://www.cnblogs.com/kiuhghcsc/p/5550829.html