题目地址

https://www.luogu.org/problem/P1850

题解

这题的转移其实挺好想的但是方程特别长...真的特别长...

首先设\(f[i,j,0/1]\)表示当前在第\(i\)个位置,申请了\(j\)次,当前这次申请了/没申请,\(a[i]\)为当前被安排的课室位置,\(b[i]\)为可申请的课室位置,\(p[i]\)为申请通过的概率,\(d[i][j]\)表示\(i\)到\(j\)的最短路。

那么对于\(f[i,j,0]\),分类上一次申请了和上一次没有申请两种情况来转移,上一次没申请了就直接转移,上一次申请了就分别讨论申请通过的情况和没通过的情况,然后加起来即可。

\(f[i][j][0]=\min \{ f[i-1][j][0]+d[a[i-1]][a[i]],f[i-1][j][1]+d[a[i-1]][a[i]]*(1-p[i-1])+d[b[i-1]][a[i]]*p[i-1]\}\)

对于\(f[i,j,1]\),共四种情况需要组合,并且因为两次申请互相独立,所以需要乘法原理乘起来(我第一次就是写成了加法然后挂掉了)。

\(f[i][j][1]=\min(f[i-1][j-1][0]+d[a[i-1]][b[i]]*p[i]+d[a[i-1]][a[i]]*(1-p[i]),f[i-1][j-1][1]+d[a[i-1]][a[i]]*(1-p[i-1])*(1-p[i])+d[a[i-1]][b[i]]*p[i]*(1-p[i-1])+d[b[i-1]][a[i]]*(p[i-1])*(1-p[i])+d[b[i-1]][b[i]]*p[i-1]*p[i])\)

#include <bits/stdc++.h>
using namespace std; int d[310][310];
int a[2010], b[2010];
int n, m, V, E;
double p[2010], f[2010][2010][2];
// f[i][j][0/1] 表示第i间教室换了j次这次换/不换 int main() {
memset(d, 0x3f, sizeof(d));
scanf("%d%d%d%d", &n, &m, &V, &E);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
for(int i = 1; i <= n; ++i) scanf("%d", &b[i]);
for(int i = 1; i <= n; ++i) scanf("%lf", &p[i]);
for(int u, v, w, i = 1; i <= E; ++i) {
scanf("%d%d%d", &u, &v, &w);
d[v][u] = d[u][v] = min(d[u][v], w);
}
for(int i = 1; i <= V; ++i) d[i][i] = d[i][0] = d[0][i] = 0;
for(int k = 1; k <= V; ++k)
for(int i = 1; i <= V; ++i)
for(int j = 1; j <= V; ++j)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
for(int i = 0; i <= n; ++i) for(int j = 0; j <= m; ++j)
f[i][j][0] = f[i][j][1] = 1e17;
f[1][0][0] = f[1][1][1] = 0;
for(int i = 2; i <= n; ++i) {
f[i][0][0] = f[i - 1][0][0] + d[a[i - 1]][a[i]];
for(int j = 1; j <= min(i, m); ++j) {
f[i][j][0] = min(f[i][j][0], min(f[i-1][j][0]+d[a[i-1]][a[i]], f[i-1][j][1]+d[a[i-1]][a[i]]*(1-p[i-1])+d[b[i-1]][a[i]]*p[i-1]));
f[i][j][1] = min(f[i][j][1], min(f[i-1][j-1][0]+d[a[i-1]][b[i]]*p[i]+d[a[i-1]][a[i]]*(1-p[i]),
f[i-1][j-1][1]+d[a[i-1]][a[i]]*(1-p[i-1])*(1-p[i])+d[a[i-1]][b[i]]*p[i]*(1-p[i-1])+d[b[i-1]][a[i]]*(p[i-1])*(1-p[i])+d[b[i-1]][b[i]]*p[i-1]*p[i]));
}
}
double ans = 1e17;
for(int i = 0; i <= m; ++i) ans = min(ans, min(f[n][i][0], f[n][i][1]));
printf("%.2lf\n", ans);
}

LGOJP1850 换教室的更多相关文章

  1. 【bzoj4720】[NOIP2016]换教室

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

  2. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

  3. [BZOJ 4720][NOIP 2016] 换教室

    记得某dalao立了"联赛要是考概率期望我直播吃键盘"的$flag$然后就有了这道题233333 4720: [Noip2016]换教室 Time Limit: 20 Sec  M ...

  4. [NOIp2016] 换教室

    题目类型:期望\(DP\) 传送门:>Here< 题意:现有\(N\)个时间段,每个时间段上一节课.如果不申请换教室,那么时间段\(i\)必须去教室\(c[i]\)上课,如果申请换课成功, ...

  5. luoguP1850 换教室

    luoguP1850 换教室 链接 https://www.luogu.org/problemnew/show/P1850 思路 状态很显然就是f[n][k][0/1] 前i次,用了k次机会,当前是在 ...

  6. bzoj4720 / P1850 换教室(Floyd+期望dp)

    P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...

  7. BZOJ 4720 [Noip2016]换教室

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

  8. 洛谷 P1850 换教室 解题报告

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

  9. P1850 换教室

    P1850 换教室 现在有一张图, 有 \(v <= 300\) 个节点 你需要从 \(c_{1}\) 到 \(c_{2}\) 到 \(c_{n} (n <= 2000)\) 现在你有 \ ...

随机推荐

  1. Equinox开源项目CQRS架构分析

    CQRS架构下Equinox开源项目分析 一.DDD分层架构介绍 本篇分析CQRS架构下的Equinox开源项目.该项目在github上star占有2.4k.便决定分析Equinox项目来学习下CQR ...

  2. HTML5自定义select标签样式的方法

    HTML5自定义select标签样式的方法 -webkit-appearance: none; 这个东西可以隐藏箭头 不过手机端就直接 设置透明度为0就行了(如果这种做法比前面个要麻烦点 毕竟还要对他 ...

  3. Docker容器数据管理(数据卷&数据卷容器)

    一:前言 在Docker容器的实际使用中,经常会遇到容器的数据持久化,容器之间的数据共享等问题,通常我们有两种解决方案: 1)数据卷(Data Volumes):就是将容器内数据直接映射到本地主机环境 ...

  4. John Lemon's Haunted Jaunt(鬼屋游戏笔记)

    1.使用Unity  2019.2.3 2.角色移动的控制脚本 3.后期处理组件PostProcessLayer  (类似给相机加上了一层滤镜) 4.制作简单的怪物AI系统,使用 NAvMeshAge ...

  5. NOI2019 退役记

    最终还是在意料之中退役了. 总的来说,这一年确实曲折坎坷,曾踏足山巅,也曾陷入低谷,二者都让我受益良多. 没有太多不甘,水平已经正常发挥,哪敢还有一丝奢求. 省选时其实已经早就做好退役的准备了,但命运 ...

  6. C#服务器全面讲解与制作

    C#服务器全面讲解与制作一 环境配置与基础架构 环境配置 基础的服务器架构 这里我会讲解高级的C#服务器的全面制作流程 会对大家有很大的帮助 不过在这个教程中主要是讲解服务器的制作,所以不会讲解客户端 ...

  7. C# vb .net实现轮廓特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的轮廓特效呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...

  8. Ole操作帮助类

    /// <summary> /// Ole操作类 /// </summary> public class OleDataBaseHandle { private static ...

  9. 自学Python编程的第\七天----------来自苦逼的转行人

    2019-09-17-23:09:48 今天学的内容是有关小数据池的,学的有点懵逼,感觉越来越难学了,但是得坚持下去 明天学习下一个课程时,感觉要跟不上,看来明天得先看好几遍今天的内容 不然肯定会听的 ...

  10. 一个超实用的python爬虫功能使用 requests BeautifulSoup

    一个简单的数据爬取的示例 import os,re import requests import random import time from bs4 import BeautifulSoup us ...