P1850 换教室

先用Floyd把最短路处理一遍,接下来就是重头戏了

用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否(1/0)申请换了教室

需要知道的一点是:既然是期望,我们求的就是边权*概率(P4316 绿豆蛙的归宿)的和

同样的,在这题中,我们需要求的是,可转移的状态(d [ i ][ j ])*概率之和

既然是求最小期望,那么我们只要求从第 1->n 个时间段中可以转移的最短(期望)路径,统计这条路径上的期望即可

所以列出状态转移方程(详见代码),解决qwq

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
inline int Int(){
char c=getchar(); int x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
return x;
}
inline int min1(const int &a,const int &b) {return a<b? a:b;}
inline double min2(const double &a,const double &b) {return a<b ?a:b;} int n,m,v,e,a[],b[],d[][];
double c[],f[][][]; int main(){
n=Int(); m=Int(); v=Int(); e=Int();
for(int i=;i<=n;++i) a[i]=Int();
for(int i=;i<=n;++i) b[i]=Int();
for(int i=;i<=n;++i) scanf("%lf",&c[i]); memset(d,,sizeof(d));
int q1,q2,q3;
for(int i=;i<=e;++i){
q1=Int(); q2=Int(); q3=Int();
d[q1][q2]=d[q2][q1]= d[q1][q2]<q3 ? d[q1][q2]:q3;
}
for(int k=;k<=v;++k)
for(int i=;i<=v;++i)
for(int j=;j<=v;++j)
d[i][j]=min1(d[i][j],d[i][k]+d[k][j]);
for(int i=;i<=v;++i) d[i][i]=;
//Floyd最短路
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
f[i][j][]=f[i][j][]=;
f[][][]=f[][][]=;
for(int i=;i<=n;++i) //对于每一种状态进行转移:找到一种期望最小、可以转移过来的状态
{
f[i][][]=f[i-][][]+d[a[i-]][a[i]];
for(int j=;j<=m;++j)
{
f[i][j][]=min2(f[i][j][],f[i-][j][]
+(double)d[a[i-]][a[i]]); //这次和上次都不申请
f[i][j][]=min2(f[i][j][],f[i-][j][]
+(double)d[b[i-]][a[i]]*c[i-] //这次不申请,上次申请成功
+(double)d[a[i-]][a[i]]*(1.0-c[i-])); //这次不申请,上次申请失败
f[i][j][]=min2(f[i][j][],f[i-][j-][]
+(double)d[a[i-]][b[i]]*c[i] //这次申请成功,上次不申请
+(double)d[a[i-]][a[i]]*(1.0-c[i])); //这次申请失败,上次不申请
f[i][j][]=min2(f[i][j][],f[i-][j-][]
+(double)d[b[i-]][b[i]]*c[i-]*c[i] //这次和上次都申请成功
+(double)d[a[i-]][b[i]]*(1.0-c[i-])*c[i] //这次申请成功,上次申请失败
+(double)d[b[i-]][a[i]]*c[i-]*(1.0-c[i]) //这次申请失败,上次申请成功
+(double)d[a[i-]][a[i]]*(1.0-c[i-])*(1.0-c[i])); //这次和上次都申请失败
}
}
double ans=100000000.00;
for(int i=;i<=m;++i) ans=min2(ans,min2(f[n][i][],f[n][i][])); //扫一遍找最小期望
printf("%.2lf",ans);
return ;
}

bzoj4720 / P1850 换教室(Floyd+期望dp)的更多相关文章

  1. NOIP2016Day1T3换教室(floyd+期望dp)

    啊...这个时间写博客,明天还要上学,整个人都不好了... 这是我写的第一道期望题hiahiahia... 题目大意就不说了QWQ 80分儿做法:先floyd,爆搜枚举哪些点取,求出答案,效率O(C( ...

  2. 洛谷P1850 换教室 [noip2016] 期望dp

    正解:期望dp 解题报告: 哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星! 好那先把这题理顺了嗷qwq 首先我们看到期望就会 ...

  3. 2018.08.30 bzoj4720: [Noip2016]换教室(期望dp)

    传送门 一道无脑的期望dp. 用f[i][j][0/1]表示前i堂课提出了j次申请且第i堂课没有(有)提出申请. 这样就可以状态转移了. 然而这题状态转移方程有点长... (主要是情况多... 代码: ...

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

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

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

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

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

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

  7. bzoj 4720: [Noip2016]换教室【期望dp】

    状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) #include<iostream> #include<cstdio ...

  8. 【NOIP2016】Day1 T3 换教室(期望DP)

    题目背景 NOIP2016 提高组 Day1 T3 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程安排在 n 个时间段上. ...

  9. NOIP 2016 换教室(期望dp)

    第一次做期望dp 并不知道每个阶段的期望之和就是整个的期望之和 所以一直卡在这 期望=代价*概率 然后注意只有申请了才算期望,否则按原来的. 这道题和前几个课程,申请的限制,当前选或不选,有关 这样很 ...

随机推荐

  1. TVTK安装

    首先感觉到的一点就是在https://www.lfd.uci.edu/~gohlke/pythonlibs/#chaco这个比较受欢迎的下载Python库的网站上下载大于20mb的whl文件时就很可能 ...

  2. linux sed 常见字符串处理

    1.删除特殊字符 将 1.1.0_boke_1.0.1 转换为110_boke_101 command: new_var=`echo 1.1.0_boke_1.0.1 |sed  s/\.//g` ( ...

  3. js模拟栈---进制转化。十进制转任意进制进制,任意进制转十进制

    var Stack = (function(){ var items = new WeakMap(); //先入后出,后入先出 class Stack{ constructor(){ items.se ...

  4. Dotfuscator 使用图解教程

    Dotfuscator:是.NET混淆器和压缩器,它可以帮助您防止您的应用程序被反编译.同时,它还可以使得您的应用程序更加小巧以及高效.我用的是4.9版本的Dotfuscator,Dotfuscato ...

  5. (转载)spring RestTemplate用法详解

    前面介绍过spring的MVC结合不同的view显示不同的数据,如:结合json的view显示json.结合xml的view显示xml文档.那么这些数据除了在WebBrowser中用JavaScrip ...

  6. rsync+inotify磁盘数据实时同步

    一.rsync+inotify主服务器部署 1.1安装rsync [root@nginx ~]# cd /usr/src/ [root@nginx src]# tar zxvf rsync-3.0.9 ...

  7. RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例

    前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密  私加 ===================== ...

  8. 原型链(_proto_) 与原型(prototype) 有啥关系?

    prototype对象里面方法及属性是共享的...... 1.JavaScript 中每一个对象都拥有原型链(__proto__)指向其构造函数的原型( prototype),object._prot ...

  9. msyql 移动某一列数据到某列 & 字段加前缀

    #移动数据 UPDATE dcs_organize_user AS a, dcs_organize_user AS b SET a.SHORTTELNO=b.USERTELNO WHERE a.id= ...

  10. hdu2262 高斯消元

    题目:有一个地图,一个人从某个点出发,问走到花园的期望步数为多少 设某点的期望步数为Ei. 那么目标的Ei=0. Ei=(Enext1+Enext2……Enextk)/k+1. 为什么是这个公式 因为 ...