概率DP求期望大多数都是全期望公式的运用。主要思考状态空间的划分以及状态事件发生的概率。问题可以分为无环和有环两类。无环一类多数比较简单,可以通过迭代或者记忆化搜索完成。有环一类略复杂,可以通过假设方程化简公式解决或者高斯消元求解。

POJ 2096 Collecting Bugs

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

概率DP入门题,注意理解和状态的转移过程才能建立方程。

dp[i][j]表示已经找到i种系统的j种bug时达到目标状态时的期望,此时找到一个bug,可能仍属于原来i种系统j种bug,也可能是第i+1种系统j种bug,也可能是i种系统第j+1种bug,也可能是第i+1种系统第j+1种bug,不同情况有不同的概率。这是所谓的马尔柯夫过程。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
][];
][];
double r;
int n,s;
double dp(int i,int j)
{
    if(vis[i][j]||i>n||j>s) return f[i][j];
    vis[i][j]=true;
    f[i][j]=+(n-i)*j/r*dp(i+,j)+i*(s-j)/r*dp(i,j+)+(n-i)*(s-j)/r*dp(i+,j+);
    f[i][j]/=(-i*j/r);
    return f[i][j];
}
int main()
{
    scanf("%d%d",&n,&s);
    r=n*s;
    vis[n][s]=;
    f[n][s]=;
    printf(,));
    ;
}

UVa 11762  Race to 1

概率DP,马尔柯夫过程。

dp[i]表示i经过题目变换得到1的期望,这样dp[i]=(s[i]-p[i])/s[i]*dp[i]+sum{1/s[i]*dp[i/prime[i][j]]}其中s[i]表示1到i之间的素数个数,p[i]表示数字i

的质因子个数,prime[i][j]表示数字i的第j个质因子。

终止条件是dp[1]=0。因为1不需要变化就能得到1,所以期望的步骤数是0。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define maxn 1000000
using namespace std;
];
];
vector<];
void init()
{
    memset(is_prime,,sizeof(is_prime));
    is_prime[]=;
    ; i<=maxn; ++i)
        if(is_prime[i])
        {
            numb[i].push_back(i);
            for(int j=i+i; j<=maxn; j+=i)
            {
                is_prime[j]=false;
                numb[j].push_back(i);
            }
        }
    ; i<=maxn; ++i)
        ]+;
        ];
}
];
];
int n;
double dp(int x)
{
    if(vis[x]) return f[x];
    vis[x]=true;
    f[x]=;
    ; i<numb[x].size(); ++i)
        f[x]+=1.0/sum[x]*dp(x/numb[x][i]);
    f[x]/=(-((sum[x]-numb[x].size())/1.0/sum[x]));
    return f[x];
}
int main()
{
    ;
    scanf("%d",&T);
    f[]=;
    vis[]=;
    init();
    while(T--)
    {
        scanf("%d",&n);
        printf("Case %d: %.10lf\n",++kase,dp(n));
    }
    ;
}

HDU  4405 Aeroplane chess

简单的概率DP,注意用记忆化搜索会爆栈。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,m;
];
],p;
int main()
{
    p=/6.0;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(!n&&!m) break;
        memset(move,,sizeof(move));
        ; i<m; ++i)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            move[x]=y;
        }
        memset(f,,sizeof(f));
        ; i>=; --i)
        {
            if(move[i]) f[i]=f[move[i]];
            else
            {
                f[i]=;
                ; j<=; ++j)
                    f[i]+=p*f[i+j];
            }
        }
        printf(]);
    }
    ;
}

HDU 3853 LOOPS

经典的简单概率DP,注意可能有到达自身概率是1的情况,这种地方不可能再达到别的地方,所以应该被忽略掉。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
][][];
][];
int n,m;
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(pro,,sizeof(pro));
        memset(dp,,sizeof(dp));
        ; i<=n; ++i)
            ; j<=m; ++j)
                scanf(],&pro[i][j][],&pro[i][j][]);
        ; --i)
            ; --j)
            {
                if(i==n&&j==m) continue;
                dp[i][j]=;
                ]==) dp[i][j]=;
                else
                {
                    dp[i][j]+=pro[i][j][]*dp[i][j+]+pro[i][j][]*dp[i+][j];
                    dp[i][j]/=(-pro[i][j][]);
                }
            }
        printf(][]);
    }
    ;
}

ZOJ 3329  One Person Game

带环的概率DP。设dp[i]表示当前为i分时到结束游戏时的期望,这样dp[i]=r*dp[0]+∑pk*dp[i+x]。其中r表示第一二三个骰子分别取a,b,c时的概率即1/(k1*k2*k3)。pk表示三个骰子和为x时的概率。终止条件时i>=n时,dp[i]=0。我们的最终答案是dp[0],但是这里每次递推都需要用到dp[0],显然不符合动规的特点,是所谓有环。因此需要别的方法。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define ll long long
#define MAXN 30005
using namespace std;
],B[];
];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k1,k2,k3,a,b,c;
        scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c);
        double r=1.0/(k1*k2*k3);
        memset(A,,sizeof(A));
        memset(B,,sizeof(B));
        memset(pro,,sizeof(pro));
        ; i<=k1; ++i)
            ; j<=k2; ++j)
                ; k<=k3; ++k)
                    if(!(i==a&&j==b&&k==c))
                        pro[i+j+k]+=r;
        int s=k1+k2+k3;
        ; --i)
        {
            ; j<=s; ++j)
            {
                A[i]+=pro[j]*A[i+j];
                B[i]+=pro[j]*B[i+j];
            }
            A[i]+=r;
            B[i]++;
        }
        printf(]/(-A[]));
    }
    ;
}

ZOJ 3582 Back to the Past

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4624

概率DP求期望。dp[i][j]表示两侧分别亮了i和j个灯,然后枚举当天左右两侧分别亮的灯数,这里要注意求概率,比如左右两侧分别亮了k1、k2个灯,那么该事件发生的概率是

C[n-i][k1]*pow(p,k1)*pow(1-p,n-i-k1)*C[n-j][k2]*pow(p,k2)*pow(1-p,n-j-k2),注意这里选择亮的灯的部分。记忆化搜索或者递推都可以解决。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#define maxn 1000000
using namespace std;
int n,m;
double p;
][];
][],pro[][];
][];
void init()
{
    pro[][]=pro[][]=;
    ; i<=*n; ++i)
    {
        pro[][i]=pro[][i-]*p;
        pro[][i]=pro[][i-]*(-p);
    }
}
double dp(int a,int b)
{
    ;
    if(vis[a][b]) return f[a][b];
    vis[a][b]=true;
    f[a][b]=;
    ; i<=n-a; ++i)
        ; j<=n-b; ++j)
        {
            &&j==))
                f[a][b]+=C[n-a][i]*pro[][i+j]*C[n-b][j]*pro[][n*-a-b-i-j]*dp(a+i,b+j);
        }
    f[a][b]/=(-pro[][n*-a-b]);
    return f[a][b];
}
int main()
{
    C[][]=;
    ; i<=; ++i)
    {
        C[i][]=C[i][i]=;
        ; j<i; ++j)
            C[i][j]=C[i-][j]+C[i-][j-];
    }
    while(scanf("%d%d%lf",&n,&m,&p))
    {
        if(!n&&!m&&!p) break;
        init();
        memset(vis,,sizeof(vis));
        memset(f,,sizeof(f));
        printf(,));
    }
    ;
}

ACM - 概率、期望题目 小结(临时)的更多相关文章

  1. [LnOI2019]加特林轮盘赌(DP,概率期望)

    [LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...

  2. 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  3. [Nowcoder212D]禁书目录_概率期望

    禁书目录 题目大意:清教需要定期给Index清除记忆,在此之前需要把当中的十万三千本禁书取出来......不幸的是,禁书一旦离开了Index就非常脆弱,具体来说,每一本禁书都有一个魔力值 ai ,其记 ...

  4. 51nod 1943 联通期望 题解【枚举】【二进制】【概率期望】【DP】

    集合统计类期望题目. 题目描述 在一片大海上有 \(n\) 个岛屿,规划建设 \(m\) 座桥,第i座桥的成本为 \(z_i\),但由于海怪的存在,第 \(i\) 座桥有 \(p_i\) 的概率不能建 ...

  5. 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp

    题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...

  6. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

  7. bzoj 2969: 矩形粉刷 概率期望

    题目: 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩形 ...

  8. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

  9. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

随机推荐

  1. 关于e820cycles参数

    关于e820cycles参数http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=327458&pid= ...

  2. 配置NGReport 报告中文

    1. 测试报告的名称 在测试开始或测试监听器的类中加上下面一句代码即可: System.setProperty("org.uncommons.reportng.title", &q ...

  3. 求出数组前面k个元素或数组中元素大于一半的元素(快速排序与堆排序的灵活运用)

    写这个的目的在于,说明快速排序的灵活运用.我们来看下关于快速排序中的一部分关键代码: 快速排序代码: int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 void quickso ...

  4. CSS3的颜色透明度 ajax请求时loading

    1.background-color:rgba(0,0,0,0.65)         这行代码让覆盖层变黑色,且有0.6的透明度 正常情况下遮盖层会把透明度遗传给弹出框(它的子元素),但是利用CSS ...

  5. swf2pdf转swf时字符集问题【转】

    今天转了一个的pdf是出现字符集问题,并转换的swf为乱码.出现的错误如下. 错误的原因是缺少中文字符集GBK-EUC-H.解决方法使用xpdf增加缺少的字符集.解决步骤如下: (一) 下载相关的xp ...

  6. 51nod 1021 石子归并(dp)

    51nod 1021 石子归并 题解:从i到j合并的最小值:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]); 最 ...

  7. 有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)

    各位选手,各位教练,大家好,我是来自清华大学交叉信息学院的陈立杰,今天很荣幸站在这里代表全体参赛选手发言.对于我来说,这是我第一次正式参加ACM的比赛.不过我跟ACM之间的缘分,大概在很早的时候就已经 ...

  8. arrow css

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. spring mvc与mybatis收集到博客

    mybaits-spring 官方教程 http://mybatis.github.io/spring/zh/ SpringMVC 基础教程 框架分析 http://blog.csdn.net/swi ...

  10. cf卡中,wtmp文件较大,导致磁盘空间满了

    看了一下,有一个wtmp 和wtmp.1的文件非常大.wtmp记录的是机器注销.启动的信息.由此可见,机器长时间的不断重启,造成该日志记录超级大,把cf的空间给占满了. wtmp日志可以用who和la ...