题意:给出n个点m条边的无向图,两个主角聪聪和可可开始分别在S点和T点。聪聪想吃掉可可,每次由匆匆先行动后来可可行动。聪聪的行动是选他到可可的最短路上的点走最多两步(如果最短路有几条就选编号最小的走),可可的行动是等概率选择一个出点或者不动。问聪聪吃掉可可的期望行动次数。

解法:这道题还是蛮有意思的。

首先我们必须得先注意到聪聪得行动是“智能”的不随机,这样我们不能计算的时候再考虑,我们必须得先预处理nxt[x][y]代表若聪聪在x点可可在y点下一步聪聪会走那个点(根据定义就是x到y最短路的编号最小点)预处理这个我们可以做n次最短路,方法是:当在x点能更新到某个点y的最短路的时候,随便把这个nxt[st][y]与nxt[st][x]取一个最小值。

预处理之后我们就可以开始计算答案了。

因为在图上dp,没有比较显然的阶段所以我们使用记忆化搜素。dp[x][y]代表聪聪在x点,可可在y点的期望答案。分3种情况转移:

①x==y  , dp[x][y]=0

②x能通过1/2步走到y,dp[x][y]=1

③否则  to=x向y走两步走到的点,dp[x][y]=(sigma(dp[to][z])+dp[to][y]) / (du[y]+1) + 1 ;   (z表示y出点,du[y]表示y出度),应该比较好理解就是聪聪先走两部,然后可可随机走一步(或者停)的期望相加。

这里提一点,为什么在这个图上能走dp,dp状态之间不会有环吗?因为其实聪聪的行动是十分“智能”的,这就导致了dp状态之间其实不会有环,会有先后顺序。

代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e3+;
  4. const int INF=0x3f3f3f3f;
  5. int n,m,s,t;
  6. vector<int> G[N];
  7. double dp[N][N];
  8. bool vis[N][N];
  9.  
  10. int nxt[N][N];
  11. queue<int> q;
  12. int dis[N]; bool inq[N];
  13. void spfa(int st) {
  14. for (int i=;i<=n;i++) dis[i]=INF,inq[i]=;
  15. dis[st]=;
  16. for (int i=;i<G[st].size();i++) {
  17. int y=G[st][i];
  18. dis[y]=; q.push(y); inq[y]=;
  19. nxt[st][y]=min(nxt[st][y],y);
  20. }
  21. while (!q.empty()) {
  22. int x=q.front(); q.pop();
  23. for (int i=;i<G[x].size();i++) {
  24. int y=G[x][i];
  25. if (dis[y]>=dis[x]+) {
  26. dis[y]=dis[x]+;
  27. nxt[st][y]=min(nxt[st][y],nxt[st][x]);
  28. if (!inq[y]) q.push(y),inq[y]=;
  29. }
  30. }
  31. inq[x]=;
  32. }
  33. }
  34.  
  35. double dfs(int s,int t) {
  36. if (vis[s][t]) return dp[s][t];
  37. int to=nxt[nxt[s][t]][t];
  38. vis[s][t]=;
  39. if (s==t) return dp[s][t]=0.0;
  40. if (to==t) return dp[s][t]=1.0;
  41. dp[s][t]+=dfs(to,t);
  42. for (int i=;i<G[t].size();i++)
  43. dp[s][t]+=dfs(to,G[t][i]);
  44. dp[s][t]/=(double)(G[t].size()+);
  45. dp[s][t]+=1.0;
  46. return dp[s][t];
  47. }
  48.  
  49. int main()
  50. {
  51. cin>>n>>m>>s>>t;
  52. for (int i=;i<=m;i++) {
  53. int x,y; scanf("%d%d",&x,&y);
  54. G[x].push_back(y);
  55. G[y].push_back(x);
  56. }
  57.  
  58. memset(nxt,0x3f,sizeof(nxt));
  59. for (int i=;i<=n;i++) nxt[i][i]=i;
  60. for (int i=;i<=n;i++) spfa(i);
  61.  
  62. memset(dp,,sizeof(dp));
  63. memset(vis,,sizeof(vis));
  64. printf("%.3lf\n",dfs(s,t));
  65. return ;
  66. }

洛谷4206/NOI2005T4 聪聪和可可 期望DP+记忆化搜索的更多相关文章

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

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

  2. luogu P4206 [NOI2005]聪聪与可可 期望dp 记忆化搜索

    LINK:聪聪与可可 这道题的核心是 想到如何统计答案. 如果设f[i][j]表示第i个时刻... 可以发现还需要统计位置信息 以及上一次到底被抓到没有的东西 不太好做. 两者的位置都在变化 所以需要 ...

  3. bzoj 1415: [Noi2005]聪聪和可可 期望dp+记忆化搜索

    期望dp水题~ 你发现每一次肯定是贪心走 2 步,(只走一步的话就可能出现环) 然后令 $f[i][j]$ 表示聪在 $i$,可在 $j$,且聪先手两个人碰上面的期望最小次数. 用记忆化搜索转移就行了 ...

  4. BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】

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

  5. 洛谷 P1464 Function【动态规划(递推)/记忆化搜索(递归)】

    题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...

  6. 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1640  Solved: 962 Description I ...

  7. 【洛谷3239_BZOJ4008】[HNOI2015] 亚瑟王(期望 DP)

    题目: 洛谷 3239 分析: 卡牌造成的伤害是互相独立的,所以 \(ans=\sum f_i\cdot d_i\) ,其中 \(f_i\) 表示第 \(i\) 张牌 在整局游戏中 发动技能的概率.那 ...

  8. 【洛谷1654/BZOJ4318】OSU!(期望DP)

    题目: 洛谷1654 分析: 本人数学菜得要命,这题看了一整天才看明白-- 先说说什么是"期望".不太严谨地说,若离散型随机变量(可以看作"事件")\(X\)取 ...

  9. 洛谷P3211 [HNOI2011]XOR和路径(期望dp+高斯消元)

    传送门 高斯消元还是一如既往的难打……板子都背不来……Kelin大佬太强啦 不知道大佬们是怎么发现可以按位考虑贡献,求出每一位是$1$的概率 然后设$f[u]$表示$u->n$的路径上这一位为$ ...

随机推荐

  1. 自定义日志注解 + AOP实现记录操作日志

      需求:系统中经常需要记录员工的操作日志和用户的活动日志,简单的做法在每个需要的方法中进行日志保存操作, 但这样对业务代码入侵性太大,下面就结合AOP和自定义日志注解实现更方便的日志记录   首先看 ...

  2. Harbor在安装前的几个注意点

    由于Harbor有1.8后和前的配置不一样,决定先安装1.8,结果报错如下 [root@localhost harbor]# ./install.sh [Step 0]: checking insta ...

  3. 20180715-Java 数组

    double[] myList //首选方法 double myList[] //效果相同,但不是首选方法 该实例完整地展示了如何创建.初始化和操纵数组: public class TestArray ...

  4. springboot版本依赖

    springboot2.x及以后依赖于jdk1.8及以上. 如图:

  5. 在java中

    // 进入prompt回调 public class JSBridgeWebChromeClient extends WebChromeClient { @Override public boolea ...

  6. 【进阶技术】一篇文章搞掂:OAuth2

    一.第一步 1.什么是OAuth2,为什么应该了解 应用程序请求资源所有者进行认证,并接受tokens来访问这些资源应用程序不是以控制资源的“人”的角度去访问资源,而是用许可证举例,备用钥匙,车主主钥 ...

  7. (转)字符编码笔记:ASCII,Unicode 和 UTF-8

    转:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之 ...

  8. openlayers筛选图层

    很多时候需要筛选图层,例如选择交互(ol.interaction.Select). 图片来自官方:https://openlayers.org/en/v4.6.5/apidoc/ol.interact ...

  9. ANTLR4 实验总结

    问题总结: 1.不同类型编程语言之间转换的意义. 仅仅的字符替换?结构 2.编程语言转换的困难. 优先级:++运算符 不同语言有各自的优越性(Scala转C遇到困难) 编程思想冲突. 3.单纯应用在数 ...

  10. vue里面的this指向

    this.$http.jsonp(api).then(function(response){ console.log(response); console.log(this); this.list=r ...