http://vjudge.net/problem/viewProblem.action?id=20613

题意:不用说了,中文题。

这个题可以用概率DP来做。

题中要求猫抓到老鼠的时间期望。分析一下这个过程,如果猫在每单位时间里第一步移动没有抓到老鼠,它还可以继续移动一次。对于确定老鼠的位置,注意猫的每次移动都是固定的,而老鼠的移动位置却是不定的。

令dp[i][j]表示猫在i位置老鼠在j位置时,猫抓到老鼠的期望。next[i][j]表示猫从i位置到j位置时走最短路径需要移动到的第一个结点位置。d[i]表示结点i的度。

这样首先看猫的当前位置,如果i==j即猫和老鼠在同一个点,那么猫不用移动了这时候猫已经抓到了老师,dp[i][j]=0。

如果不等,考虑如果猫在这两次移动中抓到了老鼠,如果猫第一步移动到了老鼠当前所在位置,即next[i][j]==j,或者猫第二步移动抓到了老鼠,即next[next[i][j]][j]==j,此时所用时间都是1,dp[i][j]=1。

其他情况,考虑猫在该单位时间内没抓到老鼠,此时的状态转移取决于老鼠的行动。老鼠可以移动到任意一个和j结点相连的点,也可以停留在j点,每种情况发生的概率是1/(d[j]+1),每次转移到的状态即dp[next[next[i][j]][j]][k](k取值j,或与j点直接连边的点),运用全期望公式即可。

这样记忆化搜索可解。

其中计算next[][]的过程可以用bfs预处理。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define ll long long
#define MAXN 30005
using namespace std;
int n,m;
vector<];
][];
][];
][];
struct Point
{
    int pos,from;
    Point(,):pos(a),from(b) {}
};
void bfs(int sst)
{
    ]= {};
    queue<Point> que;
    que.push(Point(sst));
    while(!que.empty())
    {
        Point q=que.front();
        que.pop();
        ; i<gl[q.pos].size(); ++i)
        {
            if(vis[gl[q.pos][i]]) continue;
            vis[gl[q.pos][i]]=true;
            int f;
            if(q.pos==sst) f=gl[q.pos][i];
            else f=q.from;
            que.push(Point(gl[q.pos][i],f));
            next[sst][gl[q.pos][i]]=f;
        }
    }
}
double dp(int i,int j)
{
    if(vis[i][j]) return f[i][j];
    vis[i][j]=true;
    int &p=next[i][j];
    ;
    ;
    f[i][j]=;
    ; k<gl[j].size(); ++k)
        f[i][j]+=dp(next[p][j],gl[j][k]);
    f[i][j]+=dp(next[p][j],j);
    f[i][j]/=(gl[j].size()+);
    f[i][j]++;
    return f[i][j];

}
int main()
{
    scanf("%d%d",&n,&m);
    int st,ed;
    scanf("%d%d",&st,&ed);
    ; i<m; ++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        gl[x].push_back(y);
        gl[y].push_back(x);
    }
    ; i<=n; ++i)
    {
        sort(gl[i].begin(),gl[i].end());
        bfs(i);
    }
    memset(vis,,sizeof(vis));
    printf("%.3lf\n",dp(st,ed));
    ;
}

HYSBZ 1415 - 聪聪和可可(概率DP)的更多相关文章

  1. BZOJ 1415 [NOI2005]聪聪与可可 (概率DP+dfs)

    题目大意:给你一个无向联通图,节点数n<=1000.聪聪有一个机器人从C点出发向在M点的可可移动,去追赶并吃掉可可,在单位时间内,机器人会先朝离可可最近的节点移动1步,如果移动一步机器人并不能吃 ...

  2. 聪聪和可可 HYSBZ - 1415(概率 + spfa + 记忆化dp)

    Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每 ...

  3. BZOJ 1415: [Noi2005]聪聪和可可( 最短路 + 期望dp )

    用最短路暴力搞出s(i, j)表示聪聪在i, 可可在j处时聪聪会走的路线. 然后就可以dp了, dp(i, j) = [ dp(s(s(i,j), j), j) + Σdp(s(s(i,j), j), ...

  4. bzoj1415 [Noi2005]聪聪和可可【概率dp 数学期望】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1415 noip2016 D1T3,多么痛的领悟...看来要恶补一下与期望相关的东西了. 这是 ...

  5. 1415. [NOI2005]聪聪和可可【记忆化搜索DP】

    Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点 ...

  6. bzoj 1415 [Noi2005]聪聪和可可——其实无环的图上概率

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1415 乍一看和“游走”一样.于是高斯消元.n^2状态,复杂度n^6…… 看看TJ,发现因为聪 ...

  7. BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs

    BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...

  8. 概率/期望DP初步——BZOJ1415 聪聪和可可

    期望相关: 数学期望,可以简单理解的加权平均数.设有一系列的值$x_i$,每个值被取到的概率为$p_i$,则期望$E=\sum\limits_{i=1}^n p_i x_i$. 期望具有线性性:$$E ...

  9. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

随机推荐

  1. DHV 平常语言对话 一次聚会离场

    一次聚会离场 一次聚会离场,如果顺路要计划好A女生 和B女生 或者C女闺密一起回去,然后再自己回去 如果别人说:好男人, 自己一定要谦虚说: 哪里,好男人一般都是备胎. 到家了要说: 不是说: 我:我 ...

  2. C#对象的深拷贝与浅拷贝

    转载自:http://blog.163.com/hr_msn/blog/static/21549405120132250396584/ 深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会 ...

  3. C#的对象内存模型

    转载自:http://www.cnblogs.com/alana/archive/2012/07/05/2577893.html C#的对象内存模型: 一.栈内存和堆内存1.栈内存 由编译器自动分配和 ...

  4. python 练习 3

    #!/usr/bin/python # -*- coding: utf-8 -*- def z94(): #斐波那契数列 def filie(x): a,b,t=1,1,0 if x==1 or x= ...

  5. linux下shell统计文件目录下所有代码行数

    功能,统计某一目录下所有文件代码行数: 例如统计某一目录下所有.c结尾的文件代码行数:find . -name "*.c"|xargs cat|grep -v ^$|wc -l ^ ...

  6. (24)odoo中模型标识汇总

    * 设置->技术->数据结构->模型                模型    模型描述    类型    瞬态模型account.account    科目    基础对象    ...

  7. Pinyin4Net

    .net使用的汉字转拼音库.Pinyin4Net 是直接从 Pinyin4J 翻译过来的,很多代码甚至是直接copy的. 用法与pinyin4j完全相同,具体请查阅pinyin4j文档. —— 查看更 ...

  8. offsetLeft,Left,clientLeft的区别

    offsetLeft,Left,clientLeft的区别 假设 obj 为某个 HTML 控件. obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的 ...

  9. thinkjs——空对象判断

    使用thinkjs来做后台的项目开发时,总免不了进行一些数据的唯一性校验,比如说:有这么一个页面,需要对钢厂的名称做一个校验,于是自己在后台做条件搜索时,一不小心用到了两种方法: 一个是find(), ...

  10. 表单重置reset

    最近一直在做各种页面的“增删改查”,只是在做新增功能的时候,自己一直在使用 reset来清空form表单,原以为这样子的清空方法是万无一失的,可惜最终还是在进行“修改”操作完了之后再“新增”的时候,就 ...