poj 3744 矩阵加速--概率DP

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

时间: 2024-10-14 18:48:47

poj 3744 矩阵加速--概率DP的相关文章

【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两个不同端点A_j和B_j (1 <= A_j<= N; 1 <= B_j <= N)表示的双向道路连接.保证城市1至少连接一个其它的城市.一开始臭气弹会被放在城市1.每个小时(包括第一个小时),它有P/Q (1 <= P <=1,000,000; 1 <= Q <

poj 2537 Tight words 概率dp

分析: 用计数dp思想:DP[I][J]=(DP[I-1][J-1]+DP[I-1][J]+DP[I-1][J+1]),最后再除pow(k+1,n)容易爆精度,改用概率dp思想DP[I][J]=(DP[I-1][J-1]+DP[I-1][J]+DP[I-1][J+1])/(k+1)即可. 代码: //poj 2537 //sep9 #include<iostream> using namespace std; double dp[128][16]; int main() { int k,n;

POJ 3071 Football (概率DP)

概率dp的典型题.用dp[j][i]表示第j个队第i场赢的概率.那么这场要赢就必须前一场赢了而且这一场战胜了可能的对手.这些都好想,关键是怎么找出当前要算的队伍的所有可能的竞争对手?这个用异或来算,从队伍编号的二进制表示中可以看出规律来(从二进制和相关运算里找规律也是一个重要的思考角度). #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<s

poj 2096 Collecting Bugs (概率dp 天数期望)

题目链接 题意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcomponent,问他找到所有的bugs和subcomponents的期望次数. 分析: 期望倒着推,概率正着推. dp[i][j]表示已经找到i种bug,并存在于j个子系统中,要达到目标状态的天数的期望.显然,dp[n][s]=0,因为已经达到目标了.而dp[0][0]就是我们要求的答案.dp[i][

poj 3744 Scout YYF I(矩阵优化概率DP)

Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5153   Accepted: 1404 Description YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into the enemy's base. After overcoming a series difficulties,

POJ 3071:Football 概率DP

Football 题目链接: http://poj.org/problem?id=3071 题意: 有2^n支足球队在比赛,实行淘汰制,规则如下:第一轮  1与2比,3与4比...  第二轮  1.2中的胜者和3.4中的胜者比... 以此类推 直到第n轮决出winner,求最终胜利的球队编号. 题解: 设dp[i][j]为在第i轮中j号球队胜利的概率  转移方程:dp[i][j]=∑(dp[i-1][w]*dp[i-1][j]*p[j][w])   w为该轮可能与j球队比赛的球队,则该轮j胜w的

POJ 3071 Football 【概率DP】

Football Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3734   Accepted: 1908 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all teams sti

POJ 3071 Football:概率dp

题目链接:http://poj.org/problem?id=3071 题意: 给定n,有2^n支队伍参加足球赛. 给你所有的p[i][j],表示队伍i打败队伍j的概率. 淘汰赛制.第一轮(1,2)两队比.(3,4)比.(5,6)比...共进行n轮比赛后产生冠军. 问你冠军最有可能是哪支队伍. 题解: 表示状态: dp[i][j] = probability to win 第i支队伍能够参加第j轮比赛的概率. 找出答案: i of max dp[i][n+1] n轮比赛后,冠军该参加第n+1轮比

HDU 5607 graph(矩阵优化+概率DP)

该题很容易想到求概率的转移方程:用d[i][j]表示第i步,走到j点的概率. 但是该题的k高达1e9,所以按照套路,要用矩阵相乘来优化. 第一次写矩阵相乘, 大概的意思就是利用矩阵实现递推, 并且因为每次递推的过程一样, 所以就相当于右乘这个矩阵的k次方. 用矩阵快速幂即可. 矩阵相乘这个问题, 大概可以看成, 矩阵中的每个元素表示到该点的概率, 那么另一个矩阵就是DP矩阵, 表示当前一步到各点的概率, 矩阵相乘就等于下一步到各点的概率(矩阵乘法的意义). 另外, 要对答案进行1e9+5次方再取