前言:状态贼鸡儿多,眼睛快瞎了。

-----------------------

题目链接

题目大意:给定$n(课程数),m(可换次数),v(教室数),e(无向边数)$,同时给定原定教室$c[i]$和可换教室$d[i]$,换教室成功概率为$k[i]$,边权为$w[i]$。问耗费体力的最小期望值。

-----------------

设$f[i][j][0/1]$表示上完$i$节课,换教室$j$次后($0$表示此刻不换,$1$表示刺客换)的最小期望值。

$C1=c[i-1],C2=c[i],C3=d[i-1],C4=d[i],mp[i][j]表示i到j的距离。$

先考虑不换的情况:

f[i][j][]=min(f[i][j][],min(f[i-][j][]+dis[c[i-]][c[i]],f[i-][j][]+(-k[i-])*dis[c[i-]][c[i]]+k[i-]*dis[d[i-]][c[i]]))

考虑换的情况:

f[i][j][]=min(f[i][j][],min(f[i-][j-][]+dis[c[i-]][c[i]]*(-k[i])+dis[c[i-]][d[i]]*k[i],f[i-][j-][]+dis[d[i-]][d[i]]*k[i-]*k[i]+dis[d[i-]][c[i]]*k[i-]*(-k[i])+dis[c[i-]][c[i]]*(-k[i-])*(-k[i])+dis[c[i-]][d[i]]*(-k[i-])*k[i]))

预处理最短路可以用$Floyd$,$ans=min(ans,min(f[n][i][0],f[n][i][1]))$。

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e3 + ;
const double inf = 1e17 + ;
int n, m, v, e, c[MAXN][], mp[][];
double k[MAXN], dp[MAXN][MAXN][], ans;
inline int read() {
char ch = getchar(); int u = , f = ;
while (!isdigit(ch)) {if (ch == '-')f = -; ch = getchar();}
while (isdigit(ch)) {u = u * + ch - ; ch = getchar();}return u * f;
}
int main(){
memset(mp, , sizeof(mp));
n = read(); m = read(); v = read(); e = read();
for (register int i = ; i <= n; i++)c[i][] = read();
for (register int i = ; i <= n; i++)c[i][] = read();
for (register int i = ; i <= n; i++)scanf("%lf", &k[i]);
for (register int i = ; i <= e; i++){
int x = read(), y = read(), w = read();
mp[x][y] = mp[y][x] = min(mp[x][y], w);
}
for (register int k = ; k <= v; k++)
for (register int i = ; i <= v; i++)
for (register int j = ; j <= v; j++)
mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);
for (register int i = ; i <= v; i++)mp[i][i] = mp[i][] = mp[][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 (register int i = ; i <= n; i++){
dp[i][][] = dp[i - ][][] + mp[c[i - ][]][c[i][]];
for (register int j = ; j <= min(i, m); j++){
int C1 = c[i - ][], C2 = c[i - ][], C3 = c[i][], C4 = c[i][];
dp[i][j][] = min(dp[i][j][], min(dp[i - ][j][] + mp[C1][C3], dp[i - ][j][] + mp[C1][C3] * ( - k[i - ]) + mp[C2][C3] * k[i - ]));
dp[i][j][] = min(dp[i][j][], min(dp[i - ][j - ][] + mp[C1][C3] * ( - k[i]) + mp[C1][C4] * k[i], dp[i - ][j - ][] + mp[C2][C4] * k[i] * k[i - ] + mp[C2][C3] * k[i - ] * ( - k[i]) + mp[C1][C4] * ( - k[i - ]) * k[i] + mp[C1][C3] * ( - k[i - ]) * ( - k[i])));
}
}
ans = inf;
for (register int i = ; i <= m; i++)ans = min(ans, min(dp[n][i][], dp[n][i][]));
printf("%.2lf", ans);
return ;
}

【NOIP2016】换教室 题解(期望DP)的更多相关文章

  1. bzoj 4720: [Noip2016]换教室【期望dp】

    状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) #include<iostream> #include<cstdio ...

  2. 2018.08.30 bzoj4720: [Noip2016]换教室(期望dp)

    传送门 一道无脑的期望dp. 用f[i][j][0/1]表示前i堂课提出了j次申请且第i堂课没有(有)提出申请. 这样就可以状态转移了. 然而这题状态转移方程有点长... (主要是情况多... 代码: ...

  3. Noip2016换教室(期望+DP)

    Description 题目链接:Luogu Solution 这题结合了DP和概率与期望,其实只要稍微知道什么是期望就可以了, 状态的构造很关键,\(F[i][j][0/1]\)表示已经到第\(i\ ...

  4. [Noip2016]换教室(期望+DP)

    Description 题目链接:Luogu Solution 这题结合了DP和概率与期望,其实只要稍微知道什么是期望就可以了, 状态的构造很关键,\(F[i][j][0/1]\)表示已经到第\(i\ ...

  5. [NOIP2016]换教室 题解(奇怪的三种状态)

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

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

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

  7. 【NOIP2016】Day1 T3 换教室(期望DP)

    题目背景 NOIP2016 提高组 Day1 T3 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程安排在 n 个时间段上. ...

  8. NOIP2016Day1T3换教室(floyd+期望dp)

    啊...这个时间写博客,明天还要上学,整个人都不好了... 这是我写的第一道期望题hiahiahia... 题目大意就不说了QWQ 80分儿做法:先floyd,爆搜枚举哪些点取,求出答案,效率O(C( ...

  9. NOIP 2016 换教室(期望dp)

    第一次做期望dp 并不知道每个阶段的期望之和就是整个的期望之和 所以一直卡在这 期望=代价*概率 然后注意只有申请了才算期望,否则按原来的. 这道题和前几个课程,申请的限制,当前选或不选,有关 这样很 ...

  10. Luogu P1850换教室【期望dp】By cellur925

    题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...

随机推荐

  1. day54 作业

    编写代码,将当前日期按"2017-12-27 11:11 星期三"格式输出(提示:switch结构) var date = new Date() ymd = data.toLoca ...

  2. Oracle基础介绍及常用相关sql*plus命令

    以管理员身份运行Database Configuration Assistant,新建数据库实例. 要使用Oracle首先要启动Oracle服务,在任务管理器中找到服务,打开有关OracleServi ...

  3. scrapy 基础组件专题(四):信号运用

    一.scrapy信号使用的简单实例 import scrapy from scrapy import signals from ccidcom.items import CcidcomItem cla ...

  4. AcWing 717. 简单斐波那契

    AcWing 717. 简单斐波那契 原题链接 以下数列0 1 1 2 3 5 8 13 21 -被称为斐波纳契数列. 这个数列从第3项开始,每一项都等于前两项之和. 输入一个整数N,请你输出这个序列 ...

  5. Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?

    从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用. 最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值: >>> ...

  6. nodejs之EventEmitter实现

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs. ...

  7. Web Scraping using Python Scrapy_BS4 - using Scrapy and Python(1)

    Create a new Scrapy project first. scrapy startproject projectName . Open this project in Visual Stu ...

  8. P1039 侦探推理(洛谷)

    昨天做了一个非常神奇的题,告诉我们做题之前一定要好好检测评测姬! 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先 ...

  9. ATX学习(一)-atx-server

    今天无意中发现了ATX手机设备管理平台,瞬间勾引起了我极大的兴趣,这里对学习过程中的情况做个记录. 1.搭建环境 先按照作者步骤搭建环境出来吧,哇,突然发现ATX搭建环境很方便(一会就搭建好了)   ...

  10. 异常类throwable

    一.Error 严重错误,系统内部的错误.无法通过处理,只能避免. 二.Exception 使用不当导致,是可以避免的. 异常分类: 1.编译时异常 编译时遇到的异常,若未处理,就会编译失败,必须进行 ...