POJ 3744 Scout YYF I(概率+矩阵)

题目链接:http://poj.org/problem?id=3744

题意:在X坐标轴上有一些位置是陷阱。 一个人开始在1,每次向前跳一步的概率p,跳两步的概率1-p。求安全通过所有陷阱的概率。

思路:对于两个陷阱之间的设长度为L,其实就是就是从1跳到L的概率,f[0]=0,f[1]=1,f[n]=f[n-2]*(1-p)+f[n-1]*p。





class Matrix

{

public:

    double a[2][2];



    Matrix()

    {

        clr(a,0);

    }

    Matrix(double x,double y,double z,double w)

    {

        a[0][0]=x;

        a[0][1]=y;

        a[1][0]=z;

        a[1][1]=w;

    }





    Matrix operator*(Matrix b)

    {

        Matrix ans;

        int i,j,k;

        FOR0(k,2) FOR0(i,2) FOR0(j,2)

        {

            ans.a[i][j]+=a[i][k]*b.a[k][j];

        }

        return ans;

    }

};



Matrix a,b;

int n,c[15];

double p;





double get(int x)

{

    if(x==0) return 0;

    x--;

    a=Matrix(0,1-p,1,p);

    b=Matrix(1,0,0,1);

    while(x)

    {

        if(x&1) b=b*a;

        a=a*a;

        x>>=1;

    }

    return b.a[1][1];

}



int main()

{

    Rush(n)

    {

        RD(p);

        int i;

        FOR1(i,n) RD(c[i]);

        sort(c+1,c+n+1);

        n=unique(c+1,c+n+1)-(c+1);

        double ans=1;

        i=1;

        while(i<=n)

        {

            ans*=get(c[i]-c[i-1]-1);

            ans*=(1-p);

            i++;

        }

        PR(ans);

    }

    return 0;

}

  

你可能感兴趣的:(poj)