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 并不知道每个阶段的期望之和就是整个的期望之和 所以一直卡在这 期望=代价*概率 然后注意只有申请了才算期望,否则按原来的. 这道题和前几个课程,申请的限制,当前选或不选,有关 这样很 ...
随机推荐
- CMB面试准备-基础
1.简述 private. protected. public. internal 修饰符的访问权限 private : 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可 ...
- [Java in NetBeans] Lesson 12. Arrays
这个课程的参考视频和图片来自youtube. 主要学到的知识点有: 1. Array: container that holds a fixed number of values of the sam ...
- [LeetCode] 860. Lemonade Change_Easy tag: Greedy
At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...
- [转]记解决一次“HTTP Error 400. The request URL is invalid”的错误
今天将图片服务切到使用了cdn的机器上面去,然后就部分图片报如下图错误“HTTP Error 400. The request URL is invalid” 看到这种错误信息,一般的开发者心中可能会 ...
- leetcode34. Find First and Last Position of Element in Sorted Array
二分查找不只是查找,还可以根据需求添加条件进行查找,比如这个题,左端点的条件就是边界点或者小于target,右端点的条件就是!=size()或者大于.根据这个找到查找的条件
- cocos2d-x C++ (利用定时器自定义屏幕双击事件函数)
//GameScene.h #include "cocos2d.h" USING_NS_CC; class GameScene : public cocos2d::Layer { ...
- 北京时间转为时间搓 标准时间转为UTC
int standard_to_stamp(char *str_time) { struct tm stm; int iY, iM, iD, iH, iMin, ...
- 记无法用被动方式登录远程linux主机的原因
[环境]: linux主机:华为企业云 ftp服务端:vsftpd 客户端:ftp命令行工具,安卓端ES文件浏览器 [现象]: 在ES文件浏览器中,使用被动方式没法连接,使用主动方式可以连接,但是没法 ...
- MySql语句分类
SQL语言分为四大类:数据定义语言DDL,数据查询语言DQL,数据操作语言DML,数据控制语言DCL [1]数据定义语言DDL 数据定义语言DDL,用于创建.修改.删除数据库内的数据结构.如下: (1 ...
- shell 编程每日100行
xiluhua@localhost ~/tscripts $ echo "hello world !" -bash: !": event not found xiluhu ...