hdu4050wolf5x 概率dp

//有N个格子
//p0:不能到达该格子
//p1:只能左脚到达该格子
//p2:只能右脚到达该格子
//p3:任意脚都可到达该格子,而且下一脚可以是任意脚
//人只能左脚右脚交替走,从0格出发走到的格子大于n或不能走就停止
//问走多少步停止的数学期望
//dp[i][0] 表示走到i格且下一脚出右脚的期望
//dp[i][1] 表示走到第i格且下一脚出左脚的期望
//dp[i][2] 表示走到第i格且下一脚任意的期望
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 2010;
double dp[maxn*2][3] ;
double p[maxn*2][4] ;
int main()
{
    //freopen("in.txt" ,"r" , stdin) ;
    int T ;
    scanf("%d" ,&T) ;
    while(T--)
    {
        int n , a , b ;
        scanf("%d%d%d" , &n , &a , &b);
        memset(p , 0 , sizeof(p)) ;
        for(int i = 1;i <= n;i++)
        for(int j = 0;j < 4;j++)
        scanf("%lf" , &p[i][j]) ;


        for(int i = n+1 ;i < 2*maxn;i++)
        p[i][3] = 1;


        memset(dp , 0 , sizeof(dp)) ;
        dp[n][1] = dp[n][0] = dp[n][2] = 1;
        for(int i = n-1;i >= 0 ;i--)
        {
            double temp_1 = 1 ,temp_0 = 1 , temp_2 = 1;
            for(int j = i + a;j <= b+i;j++)
            {
                dp[i][2] += temp_2*(p[j][3]*(dp[j][2]+1)+p[j][1]*(dp[j][0] +1) +p[j][2]*(dp[j][1] + 1)) ;
                dp[i][1] += temp_1*(p[j][1]*(dp[j][0]+1)+p[j][3]*(dp[j][2]+1)) ;
                dp[i][0] += temp_0*(p[j][2]*(dp[j][1]+1)+p[j][3]*(dp[j][2] + 1)) ;
                temp_1 *= (p[j][0] + p[j][2]) ;
                temp_0 *= (p[j][0] + p[j][1]) ;
                temp_2 *= p[j][0] ;
            }
        }
        printf("%.8f\n" ,dp[0][2]) ;
    }
    return 0 ;
}









































你可能感兴趣的:(hdu4050wolf5x 概率dp)