数学期望dp,题面第一次见很吓人,然而从CCF语翻译成人话就简单多了,

开始一般会想到用 f [ i ] [ j ]表示前 i 个课程申请 j 次的期望,然而其实会发现转移的时候还和上一次的情况有关(有某概率取上一次某种情况)

所以用 f [ i ] [ j ] [ 0/1 ]记录这次申请与否,然后枚举每种情况用概率乘一下即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=;
  7. int n,m,ver,edge;
  8. int c[maxn],d[maxn];
  9. long long dis[][];
  10. double f[maxn][maxn][],p[maxn],ans=0x3f3f3f3f;//第i次申请j次当前这次换/不换
  11. void floyed(){
  12. for(int i=;i<=ver;i++)dis[i][i]=;
  13. for(int k=;k<=ver;k++)
  14. for(int j=;j<=ver;j++)
  15. for(int i=;i<=ver;i++)
  16. dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
  17. }
  18. int main()
  19. {
  20. scanf("%d%d%d%d",&n,&m,&ver,&edge);
  21. for(int i=;i<=n;i++)scanf("%d",&c[i]);
  22. for(int i=;i<=n;i++)scanf("%d",&d[i]);
  23. for(int i=;i<=n;i++)scanf("%lf",&p[i]);
  24. memset(dis,0x3f,sizeof(dis));
  25. for(int i=,u,v,w;i<=edge;i++){
  26. scanf("%d%d%d",&u,&v,&w);
  27. dis[u][v]=dis[v][u]=min(dis[u][v],(long long)w);
  28. }
  29. floyed();
  30. for(int i=;i<=n;i++)
  31. for(int j=;j<=n;j++)
  32. f[i][j][]=f[i][j][]=0x3f3f3f3f;
  33. f[][][]=f[][][]=;
  34. for(int i=;i<=n;i++){
  35. f[i][][]=f[i-][][]+dis[c[i]][c[i-]];//初始化为最坏情况
  36. for(int j=;j<=min(i,m);j++){
  37. f[i][j][]=min(f[i][j][],min(f[i-][j][] + dis[c[i]][c[i-]] , f[i-][j][]+p[i-]*dis[c[i]][d[i-]] + (-p[i-])*dis[c[i]][c[i-]]));
           //前一次不申请->前一次的加上这次体力,或者前一次申请->成功的期望+失败的期望
  38. f[i][j][]=min(f[i][j][],min(f[i-][j-][] + p[i]*dis[c[i-]][d[i]] +(-p[i])*dis[c[i-]][c[i]] , //上一次没有申请,
  39. f[i-][j-][] + p[i-]*p[i]*dis[d[i]][d[i-]] //两次申请成功
  40. + (-p[i])*(-p[i-])*dis[c[i-]][c[i]] //两次申请失败
  41. + (-p[i])*p[i-]*dis[d[i-]][c[i]] //仅这次申请失败
  42. + p[i]*(-p[i-])*dis[c[i-]][d[i]])); //仅上次申请失败 }
  43. }
  44. }
  45. for(int i=;i<=m;i++)ans=min(ans,min(f[n][i][],f[n][i][]));
  46. printf("%.2lf\n",ans);
  47. }

[题解]数学期望_luogu_P1850_换教室的更多相关文章

  1. 洛谷P1850 换教室_数学期望_Floyd

    调了一下午QAQ-让我对数学期望的理解又提升了一个层次. 首先,我们发现 v<=300v<=300v<=300 , 这样我们就可以用 FloydFloydFloyd 算法来 O(n3 ...

  2. 【NOIP2016】换教室 题解(期望DP)

    前言:状态贼鸡儿多,眼睛快瞎了. ----------------------- 题目链接 题目大意:给定$n(课程数),m(可换次数),v(教室数),e(无向边数)$,同时给定原定教室$c[i]$和 ...

  3. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

  4. [NOIP2016]换教室(概率期望$DP$)

    其实吧我老早就把这题切了--因为说实话,这道题确实不难啊--李云龙:比他娘的状压DP简单多了 今天我翻以前在Luogu上写的题解时,突然发现放错代码了,然后被一堆人\(hack\)--蓝瘦啊\(ORZ ...

  5. 【bzoj4720】[NOIP2016]换教室 期望dp

    题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...

  6. 「NOIP2016」「P1850」 换教室(期望dp

    题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...

  7. P1850 换教室[dp+期望]

    流下了不会概率的眼泪,由于不会概率,转移少写了点东西... 这个dp很简单,就是一个普通的线性dp加点期望.(刚开始写这道题时信笔写下) \(dp[0/1][i][j]\)表示到第\(i\)个时间段时 ...

  8. Luogu P1850 [NOIp2016提高组]换教室 | 期望dp

    题目链接 思路: <1>概率与期望期望=情况①的值*情况①的概率+情况②的值*情况②的概率+--+情况n的值*情况n的概率举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地 ...

  9. bzoj4720 / P1850 换教室(Floyd+期望dp)

    P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...

随机推荐

  1. AndroidTest.java

    以下代码使用ApiDemos-debug.apk进行测试 package com.saucelabs.appium; import io.appium.java_client.AppiumDriver ...

  2. runtime之方法的交换

    工作中没怎么用到runtime的东西,所以一直没怎么看,现在开始拿起来. runtime之方法的交换: 都知道OC中有category可以对已知类进行扩展,但是假如工程中需要修改某类的原方法,若用ca ...

  3. C语言中的排序算法--冒泡排序,选择排序,希尔排序

    冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...

  4. HTML5 实现文件拖放上传

    1. [图片] 5375acf5gw1dusqsscfksj.jpg ​2. [代码][HTML]代码 <!DOCTYPE html><html lang="en" ...

  5. BluetoothLE-Multi-Library 一个能够连接多台蓝牙设备的库,它可以作为client端,也可以为server端。支持主机/从机,外围设备连接。

    github地址:https://github.com/qindachang/BluetoothLE-Multi-Library BluetoothLE-Multi-Library 一个能够连接多台蓝 ...

  6. JavaWeb学习总结(三)response与request

    一.response response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse.在客户端发出每个请求时,服务器 ...

  7. 截图工具,更改系统默认快捷键,系统配置实用程序,以管理员身份运行cmd(win7)

    截图工具: 开始--附件--右键发送到桌面快捷方式---桌面截图工具右键属性--快捷方式 更改系统默认快捷键: 控制面板--外观和个性化--调整屏幕分辨率--高级设置---英特尔图形和媒体控制面板-- ...

  8. poj 2420 A Star not a Tree? —— 模拟退火

    题目:http://poj.org/problem?id=2420 给出 n 个点的坐标,求费马点: 上模拟退火. 代码如下: #include<iostream> #include< ...

  9. 1--redis3.0.5集群部署安装详细步骤

    Redis集群部署文档(centos6系统) (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) ...

  10. js联动

    html: <!-- 省 --> <div class="col-sm-2"> <select name="p_id"> & ...