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. vs2013+python+ cocos2d-x-3.3rc0环境搭建

    1.vs2013安装一路next,安装即可,时间1~2个小时 2.解压cocos2d-x-3.3rc0   build文件夹里会有名为  cocos2d-win32.vc2012的sln文件  打开  ...

  2. Oracle安装后出现的问题

    安装oracle没有勾选"安装模板数据库",可以通过执行以下命令进行修改: cd $ORACLE_HOME/rdbms/admin 到这个目录下sqlplus /as sysdba ...

  3. iOS- CALayer绘图,如何绘制渐变效果图

    1.渐变效果 —> 色彩空间 首先:自定义一个渐变视图,在自定义视图中重写drawRect #import "ViewController.h" #import " ...

  4. quartz任务管理

    导入quartz相关jar包后,要执行任务的类须实现Job接口 package quartz; import org.quartz.Job; import org.quartz.JobExecutio ...

  5. jmeter body 中文显示为乱码解决

    这种情况在jmeter3.0的版本中才会产生,注意:这不是乱码,而是由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示.这样的情况可以这样调整:进入jmeter. ...

  6. Spring Cloud之Eureka服务注册与发现

    解决什么问题 ➟阐述微服务以及服务注册发现的部分概念 ➟阐述Eureka服务注册与发现的部分原理及细节 为什么需要服务中心 过去,每个应用都是一个CPU,一个主机上的单一系统.然而今天,随着大数据和云 ...

  7. [转帖]CentOS基础命令大全

    https://www.toutiao.com/i6601298434651587085/ 1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init ...

  8. Eslint 配置及规则说明(报错)

    https://blog.csdn.net/violetjack0808/article/details/72620859 https://blog.csdn.net/hsl0530hsl/artic ...

  9. Struts2+json+hignchart(简单柱状图实现--适合jquery小白)

    做了一个简单的基于Struts2 + Json + HighChart的小例子,费了一下午+晚上的时间,虽然简单,但对于我这种Jquery+Ajax小白的人还是很值得记录的. 哈哈哈 # 0. 关键点 ...

  10. 在动作类上加上SkipValidation 在反射时候会获取到该反射信息 就不会执行validate方法

    在动作类上加上SkipValidation 在反射时候会获取到该反射信息 就不会执行validate方法