bzoj4720 / P1850 换教室(Floyd+期望dp)
先用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)的更多相关文章
- NOIP2016Day1T3换教室(floyd+期望dp)
啊...这个时间写博客,明天还要上学,整个人都不好了... 这是我写的第一道期望题hiahiahia... 题目大意就不说了QWQ 80分儿做法:先floyd,爆搜枚举哪些点取,求出答案,效率O(C( ...
- 洛谷P1850 换教室 [noip2016] 期望dp
正解:期望dp 解题报告: 哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星! 好那先把这题理顺了嗷qwq 首先我们看到期望就会 ...
- 2018.08.30 bzoj4720: [Noip2016]换教室(期望dp)
传送门 一道无脑的期望dp. 用f[i][j][0/1]表示前i堂课提出了j次申请且第i堂课没有(有)提出申请. 这样就可以状态转移了. 然而这题状态转移方程有点长... (主要是情况多... 代码: ...
- Luogu P1850换教室【期望dp】By cellur925
题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...
- 【Luogu】P1850换教室(期望DP)
题目链接 又一道面向题解编程的恶心神题.真是叫人质壁分离…… 设f[i][j][k]表示考虑了前i节课,尝试了j次,当前申请结果为k时消耗的体力值. 对于f[i][j][0]有两种情况:一是我们的主角 ...
- 「NOIP2016」「P1850」 换教室(期望dp
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...
- bzoj 4720: [Noip2016]换教室【期望dp】
状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) #include<iostream> #include<cstdio ...
- 【NOIP2016】Day1 T3 换教室(期望DP)
题目背景 NOIP2016 提高组 Day1 T3 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程安排在 n 个时间段上. ...
- NOIP 2016 换教室(期望dp)
第一次做期望dp 并不知道每个阶段的期望之和就是整个的期望之和 所以一直卡在这 期望=代价*概率 然后注意只有申请了才算期望,否则按原来的. 这道题和前几个课程,申请的限制,当前选或不选,有关 这样很 ...
随机推荐
- ios9 适配的坑
http://www.cocoachina.com/ios/20151016/13715.html
- DataFrame.nunique(),DataFrame.count()
1. nunique() DataFrame.nunique(axis = 0,dropna = True ) 功能:计算请求轴上的不同观察结果 参数: axis : {0或'index',1或'co ...
- linux 释放内存及查看内存命令
查看内存使用情况: free -m 清理内存: echo 1 > /proc/sys/vm/drop_caches 再次查看内存使用情况 free -m 查看内存条数命令: dmidecode ...
- cocos2dx 3.x(游戏中的储存-UserDefault)
引擎提供的UserDefault可以简单地储存游戏中的信息,例如背景音乐音效的开关状态,用户名等等. UserDefault是一个单例对象,可以用getInstance方法来获得. 如果是第一次调 ...
- 字符串ASCII码排序
在对接第三方支付渠道的时候,第三方会要求参数按照ASCII码从小到大排序. 如下是渠道方有关生成签名规则的java代码示例: //初始化0010merkey.private文件: String mer ...
- VirtualBox下扩容vdi文件
VirtualBox下扩容vdi文件 版本:VirtualBox 5.0.14 之前VirtualBox创建的虚拟机的vdi文件过小,无法满足新的实验需求,扩容vdi文件的方法如下: 比如我这里将RH ...
- json_decode 转数组
json_decode($json); 直接转义json数据后会发现转义后的数据时对象类型, 想要获得数组型,加一个参数 json_decode($json,true);
- obv15 实例6:如果K线柱过多,ZIG将发生变动,导致明显的OBV15指标被隐藏!
obv
- vuex的使用二
1.先看项目的目录结构 2.在main.js里需要引入store这个文件并挂在实例上 import store from './store/store' ............ new Vue({ ...
- Nodejs中原生遍历文件夹
最近在听老师讲的node课程,有个关于把异步变为同步读取文件夹的知识点做一些笔记, 让迭代器逐个自执行.