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