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. 第十章I/O

    系统级i/o 开始进程时的三个标准: 标准输入(描述符0):STDIN_FILENO 标准输出(描述符1):STDOUT_FILENO 标准错误(描述符2):STDERR_FILENO 文件位置: 从 ...

  2. 20135316王剑桥 linux第六周课实验笔记

    6.存储器层次结构 6.1存储技术 1.如果你的程序需要的数据是存储在CPU寄存器中的,那么在执行期间,在零个周期内就能访问到它们.如果存储在高速缓冲中,需要1-10个周期.如果存储在主存中,需要50 ...

  3. 《JavaScript》split和join

    首先了解split和join两个函数 split 根据条件截断字符串,返回数组 //str.split(option,length) 字符串转数组 //option:表示分割依据 //length:用 ...

  4. 作业3//Calculator::1

    计算器 作业博客 github 1.扯淡 代码其实是在十几号时打的,花了半晚上加半个下午.但是懒得打随笔,所以到现在才完成. 我的课程里没找到queue,是百度照着瞎打的. 2.总结 不大理解要求,S ...

  5. asp.net文件上传接收不到文件 Request.files["']等于null

    这个时候你应该检查下你的form表单里面是否配置了这个: enctype ="multipart/form-data"  新手容易出错哦. <form id="fo ...

  6. 信安实践——自建CA证书搭建https服务器

    1.理论知识 https简介 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HT ...

  7. 编写wordcount程序

    一.程序概述 1.此次编写的程序为邹欣老师<构建之法>科书2.4.2 wordcount程序. 2.我写的wordcount程序要实现的功能整体可以总结为: ① 统计word文档中的字符数 ...

  8. HDU 1231 最大子序列

    http://acm.hdu.edu.cn/showproblem.php?pid=1231 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连 ...

  9. 第217天:深入理解Angular双向数据绑定的原理

    一.理解angular双向数据绑定 双向绑定是新的前端框架中频繁出现的一个新词汇,也是mvvm的核心原理.angularjs五条核心信念中的数据驱动,便是由双向绑定进行完成. 那么什么是双向绑定,下面 ...

  10. springmvc+json 前后台数据交互

    1. 配置(1) 文件配置参考这里(2) 导入jackson相关包:jackson-annotations-2.9.4.jar,jackson-core-2.9.4.jar,jackson-datab ...