POJ 3744(矩阵概率dp)

来源:互联网 发布:unity3d灯光阴影闪烁 编辑:程序博客网 时间:2024/06/03 00:34
#pragma warning(disable:4996)#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<vector>#include<algorithm>#include<iostream>#include<time.h>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; i<n; i++)            scanf("%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; i<n; i++)        {            if (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;}
0 0
原创粉丝点击