正解:期望dp

解题报告:

哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星!

好那先把这题理顺了嗷qwq

首先我们看到期望就会想到dp是趴,加上dp也确实很NOIp那就直接往dp的方向想嘛

比较容易想到的状态就是f[i][j]表示到第i个阶段了然后已经申请了j次的最小体力,然而在思考转移方程的时候就会发现如果这么设的话好像是不会转移的嗷,因为我们之后的转移会和你上一次是去的c还是d有关,然后就考虑再加一轮[0/1]表示上次申请了没有

然后转移这儿,巨麻烦一点点扣

f[i][j][0]:到第i个阶段了申请了j次这次没申请

既然这次没申请那i-1状态肯定也是申请j次,于是可以知道是从f[i][j]转移来的,这里简单

然后有几种可能呢?

    • 上次没申请,那就是f[i][j][0],此时的概率是100%(不申请百分百通不过嘛),那就是f[i][j][0]+dis[c[i-1]][c[i]]
    • 上次申请了,那就是f[i][j][1],此时可能通过可能没通过,如果通过了+dis[d[i-1]][c[i]]*k[i-1],没通过+dis[c[i-1]][c[i]]*(1-k[i-1])
    • 总结起来就是 min( f[i-1][j][0] + jl[c[i-1]][c[i]] , f[i-1][j][1] + (1-k[i-1])*jl[c[i-1]][c[i]] + k[i-1]*jl[d[i-1]][c[i]])

f[i][j][1]:到第i个阶段了申请了j次这次申请了

理由同上,可以知道是从f[i][j-1]转移来的

这个就会比较长了...

    • 上次没申请,f[i][j-1][0],这时有俩可能,如果这次申请通过了,+dis[c[i-1]][d[i]]*k[i],没通过,+dis[c[i-1]][c[i]]*(1-k[i])
    • 总结起来就是 f[i-1][j-1][0] + k[i]*jl[c[i-1]][d[i]] + (1-k[i])*jl[c[i-1]][c[i]]
    • 上次申请了,f[i][j-1][1],然后有四种可能(上次/这次通过否 因此22
    • 如果上次通过了这次通过了,+dis[d[i-1]][d[i]]*k[i-1]*k[i],如果上次通过了这次没通过,+dis[d[i-1]][c[i]]*k[i-1]*(1-k[i]),如果上次没通过这次通过了,+dis[c[i-1]][d[i]]*(1-k[i-1])*k[i],如果上次没通过这次还是没通过,+dis[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i])
    • 总结起来就是f[i-1][j-1][1] + (1-k[i-1])*(1-k[i])*jl[c[i-1]][c[i]] + (1-k[i-1])*k[i]*jl[c[i-1]][d[i]] + k[i-1]*(1-k[i])*jl[d[i-1]][c[i]] + k[i-1]*k[i]*jl[d[i-1]][d[i]]
    • 然后这整个儿就是 min( f[i-1][j-1][0] + k[i]*jl[c[i-1]][d[i]] + (1-k[i])*jl[c[i-1]][c[i]] , f[i-1][j-1][1] + (1-k[i-1])*(1-k[i])*jl[c[i-1]][c[i]] + (1-k[i-1])*k[i]*jl[c[i-1]][d[i]] + k[i-1]*(1-k[i])*jl[d[i-1]][c[i]] + k[i-1]*k[i]*jl[d[i-1]][d[i]] )

昂然后我觉得这个理顺了就差不多了?最后放个代码就好了qwq

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define rp(i,x,y) for(register int i=x;i<=y;++i)
  4.  
  5. +,N=+,M=+;
  6. ;
  7. int n,m,v,e,c[N],d[N],jl[V][V];
  8. ],ans=;
  9.  
  10. inline int read()
  11. {
  12. ;;
  13. '))ch=getchar();
  14. if(ch=='-')ch=getchar();
  15. )+(x<<)+(ch^'),ch=getchar();
  16. return y?x:-x;
  17. }
  18. inline void floyd()
  19. {
  20. rp(k,,v)
  21. rp(i,,v)
  22. rp(j,,i-)jl[j][i]=jl[i][j]=min(jl[i][j],jl[k][i]+jl[j][k]);
  23. }
  24. inline double min3(double x,double y,double z){return min(min(x,y),z);}
  25.  
  26. int main()
  27. {
  28. n=read();m=read();v=read();e=read();
  29. rp(i,,n)c[i]=read();rp(i,,n)d[i]=read();
  30. rp(i,,n)scanf("%lf",&k[i]);
  31. rp(i,,v)rp(j,,i-)jl[i][j]=jl[j][i]=(int)inf;
  32. rp(i,,e){int t1=read(),t2=read(),t3=read();jl[t1][t2]=min(t3,jl[t1][t2]);jl[t2][t1]=jl[t1][t2];}
  33. floyd();
  34. rp(i,,n)
  35. rp(j,,m)f[i][j][]=f[i][j][]=inf;
  36. f[][][]=f[][][]=;
  37. rp(i,,n)
  38. {
  39. rp(j,,m)
  40. {
  41. f[i][j][]=min( f[i-][j][] + jl[c[i-]][c[i]] , f[i-][j][] + (-k[i-])*jl[c[i-]][c[i]] + k[i-]*jl[d[i-]][c[i]]);
  42. )
  43. {
  44. f[i][j][]=min( f[i-][j-][] + k[i]*jl[c[i-]][d[i]] + (-k[i])*jl[c[i-]][c[i]] , f[i-][j-][] + (-k[i-])*(-k[i])*jl[c[i-]][c[i]] + (-k[i-])*k[i]*jl[c[i-]][d[i]] + k[i-]*(-k[i])*jl[d[i-]][c[i]] + k[i-]*k[i]*jl[d[i-]][d[i]] );
  45. }
  46. }
  47. }
  48. rp(i,,m)ans=min3(ans,f[n][i][],f[n][i][]);
  49. printf("%.2lf",ans);
  50. }
  51. //哦还有个细节,就,这个题目的初值赋值的时候要注意一下...我开始开小了然后只88,后来开大了点儿又爆了范围直接变成负数...ummm...真实烦skr人QAQ然后还交了两次才过的...

洛谷P1850 换教室 [noip2016] 期望dp的更多相关文章

  1. 洛谷P1850 换教室(概率dp)

    传送门 我的floyd竟然写错了?今年NOIP怕不是要爆零了? 这就是一个概率dp 我们用$dp[i][j][k]$表示在第$i$个时间段,已经申请了$j$次,$k$表示本次换或不换,然后直接暴力转移 ...

  2. 洛谷——P1850 换教室

    P1850 换教室 有 2n 节课程安排在 nn 个时间段上.在第 i个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 $c_i$​ 上课,而另一节课程在教室 $d_i$ ...

  3. 洛谷 P1850 换教室

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

  4. 洛谷 P1850 换教室 解题报告

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

  5. 洛谷P1850换教室

    题目传送门 理解题意:给定你一个学期的课程和教室数量以及教室之间的距离还有换教室成功的概率,求一个学期走的距离的期望最小值 题目是有够恶心的,属于那种一看就让人不想刷的题目...很明显的动规,但是那个 ...

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

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

  7. Luogu P1850换教室【期望dp】By cellur925

    题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...

  8. 洛谷P1850 换教室

    令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...

  9. 【Luogu】P1850换教室(期望DP)

    题目链接 又一道面向题解编程的恶心神题.真是叫人质壁分离…… 设f[i][j][k]表示考虑了前i节课,尝试了j次,当前申请结果为k时消耗的体力值. 对于f[i][j][0]有两种情况:一是我们的主角 ...

随机推荐

  1. iOS开发--NSDateFormatter

    NSDate对象包含两个部分,日期(Date)和时间(Time).格式化的时间字符串主要也是针对日期和时间的 1.基础用法 NSDate* now = [NSDate date]; NSDateFor ...

  2. O2O(online to offline)营销模式

    O2O营销模式又称离线商务模式,是指线上营销线上购买带动线下经营和线下消费.O2O通过打折.提供信息.服务预订等方式,把线下商店的消息推送给互联网用户,从而将他们转换为自己的线下客户,这就特别适合必须 ...

  3. 【python问题】UnicodeEncodeError: 'ascii' codec can't encode characters in position 306-309: ordinal not in range(128)

    今天在写python爬虫的时候,遇到一个问题 UnicodeEncodeError: 'ascii' codec can't encode characters in position 306-309 ...

  4. initializer element is not constant 问题

    在Ubuntu下,比葫芦画瓢,写了一个程序,居然报错!!!! #include <stdio.h> ; int j = *(int *)(&i) ; int main (int a ...

  5. python编程中的if __name__ == 'main': 的作用和原理

    在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享. 1.这段代码的功能 一个pyth ...

  6. C语言位操作--奇偶校验算法

    信息是以比特流的方式传输的,类似01000001.在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1.为了检测到这种错误,我们可以通过 ...

  7. 【题目】求n以内的素数个数

    最近在leetCode上刷提,还是满锻炼人的,为以后面试打基础吧.不多说下面开始. 问题:求[2,n]之间的素数的个数. 来源:leetCode OJ 提示: Let's start with a i ...

  8. 分布式搜索elasticsearch几个概念解析

    原文链接:http://blog.csdn.net/july_2/article/details/24367177 介绍下es的几个概念:cluster     代表一个集群,集群中有多个节点,其中有 ...

  9. java读取写入oracle的blob字段工具类

    import com.hzunitech.fxgk.sys.model.UtFileData;import com.jfinal.kit.PathKit;import com.jfinal.plugi ...

  10. squid白名单

    http_access deny all #取消注释 http_access allow all --> http_access allow xxx_custom_ip #添加系统服务器IP白名 ...