简单的DP,大意是给出N场比赛球队的输,平,赢的场数,最后问M场比赛至少拿S分的概率。赢一场3分,平一场1分,输0分。
dp[i][j]表示 i 场比赛得 j 分的概率。则有转移方程dp[i][j]=dp[i-1][j-3]*r1+dp[i-1][j-1]*r2+dp[i-1][j]*r3;(r1,r2,r3分别表示每一场赢,平,输的概率)
Code:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
double dp[90][270];
int main()
{
int i,j,k,n,m;
double r1,r2,r3,sum;
while(scanf("%d%d",&n,&m),n+m){
scanf("%d%d%d",&i,&j,&k);
r1=i*1.0/(i+j+k);
r2=j*1.0/(i+j+k);
r3=k*1.0/(i+j+k);
memset(dp,0,sizeof(dp));
dp[1][0]=r3;dp[1][1]=r2;dp[1][3]=r1;
for(i=2;i<=n;i++)
for(j=0;j<=3*i;j++){
if(j<=0) // 防止数组下标出现负数
dp[i][j]=dp[i-1][j]*r3;
else if(j<=1) //同上
dp[i][j]=dp[i-1][j]*r3+dp[i-1][j-1]*r2;
else
dp[i][j]=dp[i-1][j]*r3+dp[i-1][j-1]*r2+dp[i-1][j-3]*r1;
}
sum=0.0;
for(i=m;i<=3*n;i++)
sum+=dp[n][i];
printf("%.1lf\n",sum*100);
}
}