解题思路

很明显的是个期望 $dp$。

先前想到 $dp[i][j]$ 表示第决策到第 $i$ 个时间段,已经进行了 $j$ 次申请,然后就没有然后了,因为这根本就没法转移啊,你又不知道前 $i-1$ 个时间段里哪一个时间段是申请换教室了的。所以此路不通,另寻他路---题解。天哪没有题解还咋做题啊

不妨再加入一维 $[0/1]$ 表示第 $j$ 个时间段有没有进行申请操作

那么就分为一下两种情况

  • 第 $i$ 个时间段申请了
  • 第 $i$ 个时间段没有申请

那么这两种状态分别是 $dp[i][j][1]$ 和 $dp[i][j][0]$,我们然后这个期望的话是距离乘以我走这段路的概率

算第一种情况 ( $dp[i][j][1]$ ) 包含的概率又分为下面的四种情况

  • 我从 $c[i-1]\rightarrow c[i]$,这时候概率是 $(1-k[i-1])\times (1-k[i])$
  • 我从 $c[i-1]\rightarrow d[i]$,这时候概率是 $(1-k[i-1])\times k[i]$
  • 我从 $d[i-1]\rightarrow c[i]$,这时候概率是 $k[i-1] \times (1-k[i])$
  • 我从 $d[i-1]\rightarrow d[i]$,这时候概率是 $k[i-1]\times k[i]$

再算第二种情况 ( $dp[i][j][0]$ ) 包含的概率又分为两种情况

  • 我从 $c[i-1]\rightarrow c[i]$,这时候概率是 $(1-k[i-1])$
  • 我从 $d[i-1]\rightarrow c[i]$,这时候概率是 $k[i-1]$

上述的大类情况仅为 $i-1$ 这个时间段进行了申请 ( $dp[i-1][j-1][1]\ or\ dp[i-1][j][1]$ )。

下面说另一种情况 ( $dp[i-1][j-1][0]\ or\ dp[i-1][j][0]$ )

  • 第一种情况 ( $dp[i][j][1]$ )

    • 我从 $c[i-1]\rightarrow c[i]$,概率是 $1-k[i]$
    • 我从 $c[i-1]\rightarrow d[i]$,概率是 $k[i]$
  • 第二种情况 ( $dp[i][j][0]$ )

    • 我从 $c[i-1]\rightarrow c[i]$,概率是 $1$

这就是所有的情况。

至于两个点之间的最短距离因为点的数量不超过 $300$,所以可以用 $\text{Floyd}$ 来处理

状态转移方程将上面的东西稍微整理一下就出来了,不过很长,所以不单独写了,看代码里的方程

附上代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = , INF = 1e9;
int n, m, v, e, dis[maxn][maxn], c[maxn], d[maxn];
double k[maxn], 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++) cin >> k[i];
for(int i=; i<=v; i++)
for(int j=; j<=v; j++)
dis[i][j] = INF;
int x, y, z;
for(int i=; i<=e; i++) {
scanf("%d%d%d", &x, &y, &z);
dis[x][y] = dis[y][x] = min(z, dis[x][y]);
}
for(int s=; s<=v; s++)
for(int i=; i<=v; i++)
for(int j=; j<=v; j++)
if(dis[i][j] >= dis[i][s] + dis[s][j])
dis[i][j] = dis[i][s] + dis[s][j];
for (register int i = ; i <= v; i++)
dis[i][i] = dis[i][] = dis[][i] = ;
for (register int i = ; i <= n; i++)
for (register int j = ; j <= m; j++)
dp[i][j][] = dp[i][j][] = INF;
dp[][][] = dp[][][] = ;
for(int i=; i<=n; i++) {
dp[i][][] = dp[i - ][][] + dis[c[i - ]][c[i]];
for(int j=; j<=m; j++) {
dp[i][j][] = min (
dp[i-][j][] +
dis[c[i-]][c[i]] * (1.0-k[i-]) +
dis[d[i-]][c[i]] * k[i-],
dp[i-][j][] +
dis[c[i-]][c[i]]
);
dp[i][j][] = min (
dp[i-][j-][] +
dis[d[i-]][d[i]] * k[i-] * k[i] +
dis[d[i-]][c[i]] * k[i-] * (-k[i]) +
dis[c[i-]][d[i]] * (-k[i-]) * k[i] +
dis[c[i-]][c[i]] * (-k[i-]) * (-k[i]),
dp[i-][j-][] +
dis[c[i-]][d[i]] * k[i] +
dis[c[i-]][c[i]] * (-k[i])
);
}
}
double ans = 1e17;
for(int i=; i<=m; i++)
ans = min(ans, min(dp[n][i][], dp[n][i][]));
printf("%.2lf", ans);
}

「 Luogu P1850 」 换教室的更多相关文章

  1. 「NOIP2016」「P1850」 换教室(期望dp

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

  2. [Luogu 1850] noip16 换教室

    [Luogu 1850] noip16 换教室 好久没有更博客了,先唠嗑一会,花了两天的空闲时间大致做完了昨年的noip真题 虽然在经过思考大部分题目都可出解(天天爱跑步除外),但是并不知道考试时候造 ...

  3. 【洛谷P1850】换教室[2016NOIP提高组]

    换教室 期望DP 状态: f[i][j][0/1]表示前i节课 提交j个申请 第i个教室不申请/申请(为了确定当前教室,方便转移) 的最小期望 方程: f[i][j][0]=min(f[i-1][j] ...

  4. LOJ2360. 「NOIP2016」换教室【概率DP】【Floyed】【傻逼题】

    LINK 思路 先floyed出两点最短路 然后就可以直接\(dp_{i,j,0/1}\)表示前i节课选择换j节,换不换当前这一节的最小贡献 直接可以枚举上一次决策的状态计算概率进行统计就可以了 我变 ...

  5. [LOJ] #2360. 「NOIP2016」换教室

    期望DP #include<iostream> #include<cstring> #include<cstdio> #include<cctype> ...

  6. 「NOIP2016」换教室

    传送门 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 $ 2n $ 节课程安排在 $ n $ 个时间段上.在第 $ i ...

  7. 洛谷P1850 [noip2016]换教室——期望DP

    题目:https://www.luogu.org/problemnew/show/P1850 注释掉了一堆愚蠢,自己还是太嫩了... 首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选 ...

  8. 「 Luogu P1231 」 教辅的组成

    题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ...

  9. Luogu 1580 [NOIP2016] 换教室

    先用Floyed做亮点之间的最短路,设计dp,记dp[i][j][0]为到第i节课,换了j次课,当前有没有换课达到的期望耗费体力最小值 方程(太长了还是看代码吧):dp[i][j][0]<-dp ...

随机推荐

  1. YTU 2506: 切面条

    2506: 切面条 时间限制: 1 Sec  内存限制: 128 MB 提交: 382  解决: 223 题目描述 一根高筋拉面,中间切一刀,可以得到2根面条.      如果先对折1次,中间切一刀, ...

  2. 8-13 canvas专题-阶段练习二(下)

    8-13 canvas专题-阶段练习二(下) <!DOCTYPE html> <html lang="zh-cn"> <head> <me ...

  3. [Codeforces 466C] Number of Ways

    [题目链接] https://codeforces.com/contest/466/problem/C [算法] 维护序列前缀和 , 枚举中间一段即可 , 详见代码 时间复杂度 : O(N) [代码] ...

  4. bzoj4619

    4619: [Wf2016]Swap Space Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 129  Solved: 54[Submit][Sta ...

  5. Java中wait和sleep方法的区别

    1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...

  6. GitHub上README.md教程(copy)

    [说明:转载于http://blog.csdn.net/kaitiren/article/details/38513715] 最近对它的README.md文件颇为感兴趣.便写下这贴,帮助更多的还不会编 ...

  7. bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】

    我要懒死了,所以依然是lyd的课件截图 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))},每次都从这三个的max里取min #include<iostr ...

  8. bzoj 1630: [Usaco2007 Demo]Ant Counting【dp】

    满脑子组合数学,根本没想到dp 设f[i][j]为前i只蚂蚁,选出j只的方案数,初始状态为f[0][0]=1 转移为 \[ f[i][j]=\sum_{k=0}^{a[i]}f[i-1][j-k] \ ...

  9. bzoj1015星球大战(并查集+离线)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 5572  Solved: 2563 Descri ...

  10. Asp.NET 知识点总结(一)

    1.简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有类,私有成员, 在类的内部才可以访问. protected : ...