BNU 29139 PvZ once again(概率+矩阵)

题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29139

题意:如下图,一个n*m的矩阵放满了大蒜。每个大蒜被僵尸咬K口后会消失。每咬一口大蒜,等价于该列的大蒜都被咬了一口。现在只有一个僵尸,初始时在第S行。已知对于2<=i<=n-1行的大蒜咬一口后僵尸换到相邻行的概率均为0.5,第1行只能换到第2行概率为1,第n行换到n-1行,概率为1.问最后僵尸死在第i行的概率?

BNU 29139 PvZ once again(概率+矩阵)

思路:一共需要咬K*m口。构造出转移的概率矩阵A,求A^(m*K)即可。





int n,m,K,S;



class Matrix

{

public:

    double a[130][130];



    Matrix operator*(Matrix p)

    {

        int i,j,k;

        double temp;

        Matrix ans;

        FOR1(i,n) FOR1(j,n)

        {

            temp=0;

            FOR1(k,n) temp+=a[i][k]*p.a[k][j];

            ans.a[i][j]=temp;

        }

        return ans;

    }

};





Matrix a,b;





int main()

{

    rush()

    {

        RD(n,m); RD(K,S);

        if(n==1)

        {

            puts("1.0000");

            continue;

        }

        int i;

        clr(a.a,0);

        FOR1(i,n)

        {

            if(i==1) a.a[i][2]=1;

            else if(i==n) a.a[i][n-1]=1;

            else a.a[i][i-1]=a.a[i][i+1]=0.5;

        }

        clr(b.a,0);

        FOR1(i,n) b.a[i][i]=1;

        m=m*K;

        while(m)

        {

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

            a=a*a;

            m>>=1;

        }

        FOR1(i,n-1) printf("%.4lf ",b.a[S][i]);

        printf("%.4lf\n",b.a[S][i]);

    }

    return 0;

}

  

 

你可能感兴趣的:(in)