P1850 换教室

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

在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 n节安排好的课程。如果学生想更换第 i节课程的教室,则需要提出申请。若申请通过,学生就可以在第 i个时间段去教室 $d_i$​ 上课,否则仍然在教室 $c_i$ 上课。

由于更换教室的需求太多,申请不一定能获得通过。通过计算,牛牛发现申请更换第 i节课程的教室时,申请被通过的概率是一个已知的实数 $k_i$​,并且对于不同课程的申请,被通过的概率是互相独立的。

学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多 $m$ 节课程进行申请。这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申请;牛牛可以申请自己最希望更换教室的 $m$ 门课程,也可以不用完这 mm 个申请的机会,甚至可以一门课程都不申请。

因为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从一间教室赶到另一间教室。

牛牛所在的大学有 vv 个教室,有 e 条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,通过不同的道路耗费的体力可能会有所不同。 当第 i节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。

现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。

设$dp[i][j][0]$表示前i节课换了j次且这一次没换的耗费体力值得期望和的最小值,

同理$dp[i][j][1]$表示前i节课换了j次且这一次换了的耗费体力值得期望和的最小值;

首先你换教室有可能成功,当然也有可能失败,那么你这一次的概率就等于上一次换或不换成功不成功,这一次换或不换成功不成功期望路径和的最小值。

分类讨论即可。

#include<bits/stdc++.h>

#define N 2005
using namespace std; int n,m,V,E,c[N],d[N],dis[N][N];
double k[N],ans,dp[][][]; int main()
{
scanf("%d%d%d%d",&n,&m,&V,&E);
for(int i=;i<=n;i++) scanf("%d",&c[i]);
for(int i=;i<=n;i++) scanf("%d",&d[i]);
for(int i=;i<=n;i++) scanf("%lf",&k[i]); memset(dis,0x3f,sizeof(dis));
for(int u,v,w,i=;i<=E;i++){
scanf("%d%d%d",&u,&v,&w);
dis[u][v]=dis[v][u]=min(w,dis[u][v]);
}
//Floyd预处理
for(int K=;K<=V;K++){
for(int i=;i<=V;i++){
for(int j=;j<=V;j++){
dis[i][j]=min(dis[i][K]+dis[K][j],dis[i][j]);
}
}
} for(int i=;i<=V;i++) dis[i][i]=dis[i][]=dis[][i]=; memset(dp,0x7f,sizeof(dp));
dp[][][]=dp[][][]=;
for(int i=;i<=n;i++){
dp[i][][]=dp[i-][][]+dis[c[i-]][c[i]];
for(int j=;j<=min(i,m);j++){
int c1=c[i-],c2=c[i],d1=d[i-],d2=d[i];
dp[i][j][]=min(dp[i][j][],
min(dp[i-][j][]+dis[c1][c2],
dp[i-][j][]+dis[d1][c2]*k[i-]+dis[c1][c2]*(1.0-k[i-]))); dp[i][j][]=min(dp[i][j][],
min(dp[i-][j-][]+dis[c1][c2]*(1.0-k[i])+dis[c1][d2]*k[i],//上一次没换
dp[i-][j-][]+dis[d1][c2]*k[i-]*(1.0-k[i])//上一次换了成功且这一次没成功
+dis[d1][d2]*k[i-]*k[i]//上一次换了成功且这一次也成功
+dis[c1][d2]*(1.0-k[i-])*k[i]//上一次换了没成功且这一次成功
+dis[c1][c2]*(1.0-k[i-])*(1.0-k[i])));//上一次换了没成功且这一次也没成功
// printf("%.2lf %.2lf\n",dp[i][j][0],dp[i][j][1]);
}
} ans=0x7fffffff;
for(int i=;i<=m;i++)//从0开始,可以一次也不换
ans=min(ans,min(dp[n][i][],dp[n][i][])); printf("%.2lf",ans);
return ;
}

洛谷——P1850 换教室的更多相关文章

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

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

  2. 洛谷 P1850 换教室

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

  3. 洛谷P1850换教室

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

  4. 洛谷P1850 换教室

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

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

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

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

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

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

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

  8. bzoj4720 / P1850 换教室(Floyd+期望dp)

    P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...

  9. P1850 换教室

    P1850 换教室 现在有一张图, 有 \(v <= 300\) 个节点 你需要从 \(c_{1}\) 到 \(c_{2}\) 到 \(c_{n} (n <= 2000)\) 现在你有 \ ...

随机推荐

  1. 牛了个逼,phpstorm查询技巧

    两次shift,会弹出最近常用的文件. 可以查询按照方法名,类名,文件名等进行查询. Ctrl+E可以查看最近使用的文件. Ctrl+Shift+E可以查看最近修改的文件. Ctrl+shift+N ...

  2. android EditText如何使光标随着输入内容移动

    EditText 使光标随着输入内容移动的setSelection()

  3. loj 6034 线段游戏

    题目大意: 给出若干条线段,用 (x1,y2),(x2,y2) 表示其两端点坐标,现在要求支持两种操作: 0 x1 y1 x2 y2 表示加入一条新的线段 (x1,y2),(x2,y2) 1 x0 询 ...

  4. 杂项-Java:Druod Monitor

    ylbtech-杂项-Java:Druid Monitor 1.返回顶部 1. https://www.cnblogs.com/wanghuijie/p/druid_monitor.html 2. 2 ...

  5. bzoj4818

    http://www.lydsy.com/JudgeOnline/problem.php?id=4818 矩阵快速幂+dp 首先我们来写一个dp dp[i][j]:选到第i个数,和为j,复杂度nm,不 ...

  6. ubuntu 14.04中: 像ubuntu16.04 一样可以在文件夹内打开此路径下的shell

    sudo apt-get install nautilus-open-terminal 然后重启 ok!

  7. urllib2.urlopen超时未设置导致程序卡死

    没有设置timeout参数,结果在网络环境不好的情况下,时常出现read()方法没有任何反应的问题,程序卡死在read()方法里,搞了大半天,才找到问题,给urlopen加上timeout就ok了,设 ...

  8. JS判断字符串中是否存在某个字符

    用String类中的indexOf函数,例如:String str="we find out sth";if(str.indexOf("o")==-1){ // ...

  9. 近年来火热的人工智能,其实是IT业界的一个障眼法

    近年来火热的人工智能,其实是IT业界的一个障眼法,仗着现在的计算机的计算能力牛B,把一个类仿生统计算法,宣传成了人工智能,不得不感叹一些营销人士的牛逼,说大话不腰疼.当然谎言重复一千遍也许自己也就信了 ...

  10. php编译安装参数详解

    ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/loc ...