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 并不知道每个阶段的期望之和就是整个的期望之和 所以一直卡在这 期望=代价*概率 然后注意只有申请了才算期望,否则按原来的. 这道题和前几个课程,申请的限制,当前选或不选,有关 这样很 ...
随机推荐
- numpy.meshgrid()
numpy提供的numpy.meshgrid()函数可以让我们快速生成坐标矩阵X,Y 语法:X,Y = numpy.meshgrid(x, y)输入:x,y,就是网格点的横纵坐标列向量(非矩阵)输出: ...
- iOS 新浪微博-2.0 搜索框/标题带箭头/下拉菜单
不管是搜索框还是下拉菜单,我们都需要对背景的图片进行拉伸.定义一个Category分类对图片进行操作. UIImage+Effect.h #import <UIKit/UIKit.h> @ ...
- ubuntu下ldd,查看程序动态库信息
ldd list, dynamic, dependencies linux-vdso.so. => (0x00007ffe9d9b6000) libstdc++.so. => /usr/ ...
- Hadoopif.for.while 语句
if 语句 echo 当前参数个数:$# if [ $# -lt 3 ];then echo 参数小于3;elif [ $# -gt 5 ];then echo 参数大于5;fi; To have b ...
- Linux 服务器配置网站以及绑定域名
Linux 服务器如何配置网站以及绑定域名 转载来源:http://www.xinnet.com/service/cjwt/idc/guanli/1424.html 以下列举一些 主机上常见的 Web ...
- LeetCode11.盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
- C# Mongo Client 2.4.2判断是否存在表
public async Task<bool> CollectionExistsAsync(string collectionName) { var filter = new BsonDo ...
- mybatis batchinsert
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-/ ...
- kali linux 基本命令(第一批)
pwd , rm ,locate ,cat ,head , clear ,ls ,cd ,mkdir ,touch ,ec ...
- hdu5290树形dp
题意 给了n个点的数 每个点有一个w[i]权值,如果你选择了i这个点那么距离i这个点距离为w[i]的点将被除去,最后问 选则尽量少的点把这n个点全部删除 1<=n<=100000, 0&l ...