「 Luogu P1850 」 换教室
解题思路
很明显的是个期望 $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 」 换教室的更多相关文章
- 「NOIP2016」「P1850」 换教室(期望dp
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...
- [Luogu 1850] noip16 换教室
[Luogu 1850] noip16 换教室 好久没有更博客了,先唠嗑一会,花了两天的空闲时间大致做完了昨年的noip真题 虽然在经过思考大部分题目都可出解(天天爱跑步除外),但是并不知道考试时候造 ...
- 【洛谷P1850】换教室[2016NOIP提高组]
换教室 期望DP 状态: f[i][j][0/1]表示前i节课 提交j个申请 第i个教室不申请/申请(为了确定当前教室,方便转移) 的最小期望 方程: f[i][j][0]=min(f[i-1][j] ...
- LOJ2360. 「NOIP2016」换教室【概率DP】【Floyed】【傻逼题】
LINK 思路 先floyed出两点最短路 然后就可以直接\(dp_{i,j,0/1}\)表示前i节课选择换j节,换不换当前这一节的最小贡献 直接可以枚举上一次决策的状态计算概率进行统计就可以了 我变 ...
- [LOJ] #2360. 「NOIP2016」换教室
期望DP #include<iostream> #include<cstring> #include<cstdio> #include<cctype> ...
- 「NOIP2016」换教室
传送门 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 $ 2n $ 节课程安排在 $ n $ 个时间段上.在第 $ i ...
- 洛谷P1850 [noip2016]换教室——期望DP
题目:https://www.luogu.org/problemnew/show/P1850 注释掉了一堆愚蠢,自己还是太嫩了... 首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选 ...
- 「 Luogu P1231 」 教辅的组成
题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ...
- Luogu 1580 [NOIP2016] 换教室
先用Floyed做亮点之间的最短路,设计dp,记dp[i][j][0]为到第i节课,换了j次课,当前有没有换课达到的期望耗费体力最小值 方程(太长了还是看代码吧):dp[i][j][0]<-dp ...
随机推荐
- SQLyog普通版与SQLyog企业版对比分析
这里,为什么要写这篇博客呢? 对于SQLyog普通版而言,只能复制到不同的数据库里,这样显得麻烦,当然,你也可以用语句来操作达到实现目的. 具体做法: MySQL复制旧表的结构及数据到新表 CREAT ...
- Android系统定制----删除系统锁屏功能【转】
本文转载自:http://blog.csdn.net/morixinguan/article/details/56675914 frameworks/base/packages/SettingsPro ...
- 利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全)
利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全) 14.4 利用JFreeChart生成折线图 通过JFreeChart插件,既可以生成普通效果的折线图,也可以生成3D效果的折 ...
- CentOS下VI命令整理
Vi共分三种模式,分别是“一般模式”.“编辑模式”与“命令行命令模式”. l 一般模式:vi处理文件时,一进入该文件就是一般模式.在这个模式中,可以使用“上下左右”键来移动光标,可以使 ...
- go语言---defer
go语言---defer https://blog.csdn.net/cyk2396/article/details/78885135 defer 是在函数退出前调用,多个defer遵循 先进后出 的 ...
- Java 泛型 三
一.泛型初衷 Java集合不会知道我们需要用它来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要就具有很好的通用性.但这样做也带来两个问题: –集合对元素类型没有任何限制,这样可能引 ...
- IDEA中Spark往Hbase中写数据
import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.io.ImmutableBytesWr ...
- CSS3常用知识点
CSS3常用知识点 1 css3选择器 1.1 属性选择器 /* E[attr~=val] 表示的一个单独的属性值 这个属性值是以空格分隔的*/ .attr2 a[class~="kawa& ...
- C++面向对象程序设计_Part2
目录 Composition(复合) 内存视角下的composition(复合) composition(复合)关系下的构造与析构 Delegation (委託) -- Composition by ...
- c语言小项目-使用mysql数据库的图书管理系统
VS2013通过MySQL方式连接到MySQL MySQL官网上C++的API有两个.一个是很成熟的mysql++,另一个是MySQL Connector/C++,近两年才出的,模仿JDBC做的,封装 ...