码迷,mamicode.com
首页 > 其他好文 > 详细

poj 3744 矩阵加速--概率DP

时间:2014-08-14 10:56:18      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:http   os   io   for   问题   amp   size   ef   

http://poj.org/problem?id=3744


犯二了,,递推式,矩阵幂什么都会,但是我推得跟别人不一样,,,应该是对矩阵理解问题,,,再看看

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;

#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const int MAXN=3;
double mtr[MAXN][MAXN];
double ansm[MAXN][MAXN];
int sz=2;
void mulmtr(double x[MAXN][MAXN], double y[MAXN][MAXN])
{
    double tmp[MAXN][MAXN];
    for(int i=0;i<sz;i++)
        for(int j=0;j<sz;j++)
        {
            tmp[i][j]=0;
            for(int k=0;k<sz;k++)
                tmp[i][j]+=x[i][k]*y[k][j];
        }

    for(int i=0;i<sz;i++)
        for(int j=0;j<sz;j++)
            y[i][j]=tmp[i][j];
}

void mtrmi(double mtr[MAXN][MAXN],int n)
{
    for(int i=0;i<sz;i++)
        for(int j=0;j<sz;j++)
        {
            if(i == j)ansm[i][j]=1;
            else ansm[i][j]=0;
        }
    while(n)
    {
        if(n&1)
        {
            mulmtr(mtr,ansm);
        }
        mulmtr(mtr,mtr);
        n/=2;
    }
}
int bomb[MAXN*10];
int main()
{
    //IN("poj3744.txt");
    int n;
    int last;
    double p;
    double ans=1.0;
    int pos;
    while(~scanf("%d%lf",&n,&p))
    {
        ans=1.0;
        last=1;
        for(int i=0;i<n;i++)
            scanf("%d",&bomb[i]);
        sort(bomb,bomb+n);
        for(int i=0;i<n;i++)
        {
            pos=bomb[i]-last;
            /*if(pos == 0){last=pos+1;continue;}
            if(pos == 1){ans*=(1-p);last=pos+1;continue;}
            if(pos == 2){ans*=p;last=pos+1;continue;}*/
            //pos-=2;
            mtr[0][0]=p;
            mtr[0][1]=1.0-p;
            mtr[1][0]=1.0;
            mtr[1][1]=0.0;
            mtrmi(mtr,pos);
            ans*=1.0-ansm[0][0];
            last=bomb[i]+1;
        }
        cout << fixed << setprecision(7) << ans << endl;
    }
    return 0;
}


poj 3744 矩阵加速--概率DP,布布扣,bubuko.com

poj 3744 矩阵加速--概率DP

标签:http   os   io   for   问题   amp   size   ef   

原文地址:http://blog.csdn.net/u011026968/article/details/38553367

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!