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

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

题目链接

题目大意:给定$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. Layui文本框限制正整数

    <input type="text" name="Number" lay-verify="required|integer" plac ...

  2. 一道题理解setTimeout,Promise,async/await以及宏任务与微任务

    今天看到这样一道面试题: //请写出输出内容 async function async1() { console.log('async1 start'); await async2(); consol ...

  3. 题解:2018级算法第三次上机 C3-Zexal的浩瀚星辰

    题目描述: 样例: 实现解释: 一道结合了火箭发射的贪心题目 知识点: 贪心,优先队列 题目分析: 根据题目描述可知,延迟后时间是正常推进的,也就是假设共有n个火箭,推迟k小时.则在到达k+1小时时, ...

  4. 数据可视化之DAX篇(十)在PowerBI中累计求和的两种方式

    https://zhuanlan.zhihu.com/p/64418286 假设有一组数据, 已知每一个产品贡献的利润,如果要计算前几名产品的贡献利润总和,或者每一个产品和利润更高产品的累计贡献占总体 ...

  5. CentOS 7 内核RPM方式升级

    RPM包下载地址: https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 选择lt版本(长期支持) #下载内核RPM包,这里是kernel-lt-4.4.- ...

  6. python实现图片文字提取,准确率高达99%,强无敌!!!

    上次我使用的百度AI开放平台的API接口实现图片的转化,后来有许多小伙伴都私信问我,怎么获取百度AI平台的AK和SK.为了统一回答大家的问题,今天我又使用百度API实现了一个从图片中提取文字和识别身份 ...

  7. .Net Core微服务入门全纪录(完结)——Ocelot与Swagger

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(八)--Docker Compose与容器网络]完成了docker-compose.y ...

  8. xenomai内核解析之信号signal(一)---Linux信号机制

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 1. Linux信号 1.1注册信号处理函数 ...

  9. 设计模式:command模式

    目的:将命令设计成类的形式,并可以组织成队列 优点: 在需要的情况下,可以比较容易地将命令记入日志 可以容易的实现对请求的撤销和重做 由于新的具体命令类不影响其他的命令类,因此增加新的具体命令类很容易 ...

  10. DPDK之什么是imissed、ierrors、rx_nombuf

    DPDK之什么是imissed.ierrors.rx_nombuf 在采用DPDK进行网络抓包时常常会通过rte_eth_stats_get函数获取当前网卡的丢包状态,首先看一下该函数的声明: // ...