POJ 3744(矩阵概率dp)

#pragma warning(disable:4996)
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

struct Matrix
{
    double mat[2][2];
};

Matrix mul(Matrix a, Matrix b)
{
    Matrix ret;
    for (int i = 0; i<2; i++)
        for (int j = 0; j<2; j++)
        {
        ret.mat[i][j] = 0;
        for (int k = 0; k<2; k++)
            ret.mat[i][j] += a.mat[i][k] * b.mat[k][j];
        }
    return ret;
}

Matrix pow_M(Matrix a, int n)
{
    Matrix ret;
    memset(ret.mat, 0, sizeof(ret.mat));
    for (int i = 0; i<2; i++)ret.mat[i][i] = 1;
    Matrix temp = a;
    while (n)
    {
        if (n & 1)ret = mul(ret, temp);
        temp = mul(temp, temp);
        n >>= 1;
    }
    return ret;
}

int x[30];
int vs_main()
{
    int n;
    double p;
    while (scanf("%d%lf", &n, &p) != EOF)//POJ上G++要改为cin输入
    {
        for (int i = 0; iscanf("%d", &x[i]);
        sort(x, x + n);
        double ans = 1;
        Matrix tt;
        tt.mat[0][0] = p;
        tt.mat[0][1] = 1 - p;
        tt.mat[1][0] = 1;
        tt.mat[1][1] = 0;
        Matrix temp;

        temp = pow_M(tt, x[0] - 1);
        ans *= (1 - temp.mat[0][0]);

        for (int i = 1; iif (x[i] == x[i - 1])continue;
            temp = pow_M(tt, x[i] - x[i - 1] - 1);
            ans *= (1 - temp.mat[0][0]);
        }
        printf("%.7lf\n", ans);//POJ上G++要改为%.7f
    }
    return 0;
}
int main() {
    int start = clock();
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt","w",stdout);
    printf("#===================#\n");
    vs_main();
    printf("#===================#\n");
    printf("Time:%.3lf\n", double(clock() - start) / CLOCKS_PER_SEC);
    //system("pause");
    return 0;
}

你可能感兴趣的:(ACM_POJ)