解题思路

很明显的是个期望 $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. DEDE织梦 后台特别卡,有时响应超时的解决办法

    跟大家一样,大致情况是: 1.打开后台首页第一次没问题,但是刷新或者点其他菜单就一直卡着了. 2.关掉浏览器重新进首页没问题,但是一旦进了首页再打开php页面就卡死了. 3.服务器返回Maximum ...

  2. 玲珑学院OJ 1023 - Magic boy Bi Luo with his excited math problem 树状数组暴力

    分析:a^b+2(a&b)=a+b  so->a^(-b)+2(a&(-b))=a-b 然后树状数组分类讨论即可 链接:http://www.ifrog.cc/acm/probl ...

  3. 计算属性 computed

    计算属性 computed 计算缓存 vs Methods <div id="example"> <p>Original message: "{{ ...

  4. Postgresql的一些命令

    显示所有数据表: \dt 显示表结构:  \d YOUR_TABLE 进入数据库: psql DATABASE_NAME 显示所有数据库: \list 退出: \q 删除数据库: dropdb DAT ...

  5. 第2章 微信小程序的基础组件学习

    小程序也可以用div+css进行排版. flex-direction排列方向,可以控制内部的成员的顺序,比如从左到右.从右到左.上下,纵向和横向. flex-wrap可以控制换行是如何去换行的,控制它 ...

  6. MySQL Archive存储引擎

    200 ? "200px" : this.width)!important;} --> 介绍 从archive单词的解释我们大概可以明白这个存储引擎的用途,这个存储引擎基本上 ...

  7. chrome 跨域设置-(完善博客内容)

    目的完善自己的一套 ajax前端开发流程,在网上扒了一份成功的案例. 出于一些原因往往需要将浏览器设置成支持跨域的模式,好在chrome浏览器就是支持可跨域的设置,网上也有很多chrome跨域设置教程 ...

  8. E20170606-hm

    pipeline   n. 管道; 输油管道; 渠道,传递途径; dump   vt. 倾倒; 倾销; 丢下,卸下; 摆脱,扔弃;   n. 垃圾场; 仓库; 无秩序地累积;

  9. android_app c++框架

    找遍了全网,没有一个完整的可用的框架.ndk自带的android_native_app_glue确实不太好用,闭关几天,写出了一个框架.完全的消息队列调用,目前测试的主体框架是没有什么问题了,程序入口 ...

  10. Storm概念学习系列之storm的定时任务

    不多说,直接上干货! 至于为什么,有storm的定时任务.这个很简单.但是,这个在工作中非常重要! 假设有如下的业务场景 这个spoult源源不断地发送数据,boilt呢会进行处理.然后呢,处理后的结 ...