TOJ 3051.Hopeless Coach【DP】

TOJ 3051.Hopeless Coach【DP】

简单的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);
    }

}

你可能感兴趣的:(TOJ 3051.Hopeless Coach【DP】)