P1850 换教室

现在有一张图, 有 \(v <= 300\) 个节点

你需要从 \(c_{1}\) 到 \(c_{2}\) 到 \(c_{n} (n <= 2000)\)

现在你有 \(m\) 次机会把 \(c_{i}\) 换为 \(d_{i}\), 对于第 \(i\) 个, 成功的概率为 \(k_{i}\)

求走完整个路程的期望路径长度


错误日志: 作死赋值 \(double\) 用 \(memset\)


Solution

这是第一个有关期望的题呢

本题为期望 \(dp\) , 从上一个状态转移过来(听dalao说还有一种是计算本状态对后面状态的贡献)

具体来说, 这个状态可以由以上 \(n\) 个状态得到, 每个状态权值为 \(w_{i}\), 其中第 \(i\) 个状态到此状态的概率为 \(k_{i}\), 那么有此状态可以表示为 $$dp[now] = \sum_{i = 1}^{n}{w_{i} * k_{i}}$$

本题状态为:

\(dp[i][j][0/1]\) 代表选到第 \(i\) 门课用掉 \(j\) 次机会, 此次申请或不申请的期望值

所有转移详细记录在注释中

答案自然在 \(\min_{i = 0}^{m}{\min(dp[n][i][0], dp[n][i][1])}\)

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(int (i) = (x);(i) <= (y);(i)++)
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 4019, maxv = 319;
int num, numc, numv, nr;
int map[maxv][maxv];
int c[maxn], d[maxn];
double k[maxn];
double dp[maxn][maxn][2];
void floyd(){
REP(i, 1, numv)map[i][i] = 0;
REP(k, 1, numv)REP(i, 1, numv)REP(j, 1, numv){
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
}
}
int dist(int x, int y){return map[x][y];}
void init(){
REP(i, 1, numv)REP(j, 1, numv)map[i][j] = 1e9;
REP(i, 1, num)REP(j, 0, numc)dp[i][j][0] = dp[i][j][1] = 1e9;
}
int main(){
num = RD(), numc = RD(), numv = RD(), nr = RD();
init();
REP(i, 1, num)c[i] = RD();
REP(i, 1, num)d[i] = RD();
REP(i, 1, num)cin>>k[i];
REP(i, 1, nr){
int u = RD(), v = RD(), dis = RD();
map[u][v] = min(map[u][v], dis);
map[v][u] = map[u][v];
}
floyd();
dp[1][0][0] = dp[1][1][1] = 0;//选或不选都为起点
REP(i, 2, num){
int m = min(numc, i);
REP(j, 0, m){//可以不申请换教室, 从0开始
dp[i][j][0] = min(//本次不申请
dp[i - 1][j][0] + dist(c[i], c[i - 1]),//上次不申请
dp[i - 1][j][1]//上次申请
+ dist(c[i], d[i - 1]) * k[i - 1]//申请成功
+ dist(c[i], c[i - 1]) * (1 - k[i - 1])//申请失败
);
if(!j)continue;
dp[i][j][1] = min(//本次申请
dp[i - 1][j - 1][0]//上次不申请
+ dist(d[i], c[i - 1]) * k[i]//本次成功
+ dist(c[i], c[i - 1]) * (1 - k[i]), //本次失败
dp[i - 1][j - 1][1]//上次申请
+ dist(c[i], c[i - 1]) * (1 - k[i]) * (1 - k[i - 1])//0->0
+ dist(d[i], c[i - 1]) * k[i] * (1 - k[i - 1])//0->1
+ dist(c[i], d[i - 1]) * (1 - k[i]) * k[i - 1]//1->0
+ dist(d[i], d[i - 1]) * k[i] * k[i - 1]//1->1
);
}
}
double ans = 100000019;
REP(i, 0, numc){
ans = min(ans, dp[num][i][0]);
ans = min(ans, dp[num][i][1]);
}
printf("%.2lf\n", ans);
return 0;
}

P1850 换教室的更多相关文章

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

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

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

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

  3. 洛谷——P1850 换教室

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

  4. 洛谷 P1850 换教室

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

  5. Luogu P1850 换教室(期望dp)

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

  6. P1850 换教室 期望dp

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

  7. 洛谷P1850换教室

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

  8. P1850 换教室[dp+期望]

    流下了不会概率的眼泪,由于不会概率,转移少写了点东西... 这个dp很简单,就是一个普通的线性dp加点期望.(刚开始写这道题时信笔写下) \(dp[0/1][i][j]\)表示到第\(i\)个时间段时 ...

  9. 【DP】【期望】$P1850$换教室

    链接 题目描述 有 \(2n\) 节课程安排在$ n$ 个时间段上.在第 \(i\)(\(1 \leq i \leq n\))个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在 ...

随机推荐

  1. HDU 4514 湫湫系列故事——设计风景线 树的直径

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4514 湫湫系列故事--设计风景线 Time Limit: 5000/2000 MS (Java/Ot ...

  2. Android笔记-3-EditText的属性介绍

    [Android 基础]EditText的属性介绍 EditText继承TextView,所以EditText具有TextView的属性特点,下面主要介绍一些EditText的特有的输入法的属性特点 ...

  3. Week2-作业1:阅读与博客

    Week2-作业1:阅读与博客 第一章 :概论 1. 原文如下: 移山公司程序员阿超的宝贝儿子上了小学二年级,老师让家长每天出30道加减法题目给孩子做.阿超想写一个小程序来做这件事,具体实现可以采用很 ...

  4. Alpha版本冲刺(六)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  5. css布局 弹性布局 和 网格布局

    这里就不写这两种布局的内容了 弹性布局链接:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 网格布局链接:https://www.ji ...

  6. 初识nginx——配置解析篇

    一.nginx的介绍 nginx是由俄罗斯人开发的一款高性能的http和反向代理服务器,也可以用来作为邮件代理.相比较于其他的服务器,具有占用内存少,稳定性高等优势 二.nginx的配置 nginx的 ...

  7. form表单转化json对象

    利用 $.fn 可以让每一个jquery 对象都能直接使用这个方法. //form表单转化json对象$.fn.serializeObject = function () { var o = {}; ...

  8. 微信 小程序布局 swiper 页面

    JS // pages/classify/swiper.js Page({ /** * 页面的初始数据 */ data: { current:0   }, titleBtn:function(e){ ...

  9. matlab中 assert(any(mask(:)));

    首先,matlab中any函数:检测矩阵mask中是否有非零元素,如果有,返回1,:如果没有非零元素,即所有元素都是0,那么则返回0. assert()是一个调试程序时经常使用的宏,在程序运行时它计算 ...

  10. Qt——线程类QThread

    本文主要介绍Qt中线程类QThread的用法,参考(翻译+修改)了一篇文章:PyQt: Threading Basics Tutorial,虽然使用的是PyQt,但与C++中Qt的用法大同小异,不必太 ...