【NOIP2016】换教室 题解(期望DP)
前言:状态贼鸡儿多,眼睛快瞎了。
-----------------------
题目大意:给定$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)的更多相关文章
- bzoj 4720: [Noip2016]换教室【期望dp】
状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) #include<iostream> #include<cstdio ...
- 2018.08.30 bzoj4720: [Noip2016]换教室(期望dp)
传送门 一道无脑的期望dp. 用f[i][j][0/1]表示前i堂课提出了j次申请且第i堂课没有(有)提出申请. 这样就可以状态转移了. 然而这题状态转移方程有点长... (主要是情况多... 代码: ...
- Noip2016换教室(期望+DP)
Description 题目链接:Luogu Solution 这题结合了DP和概率与期望,其实只要稍微知道什么是期望就可以了, 状态的构造很关键,\(F[i][j][0/1]\)表示已经到第\(i\ ...
- [Noip2016]换教室(期望+DP)
Description 题目链接:Luogu Solution 这题结合了DP和概率与期望,其实只要稍微知道什么是期望就可以了, 状态的构造很关键,\(F[i][j][0/1]\)表示已经到第\(i\ ...
- [NOIP2016]换教室 题解(奇怪的三种状态)
2558. [NOIP2016]换教室 [题目描述] 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1< ...
- 「NOIP2016」「P1850」 换教室(期望dp
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...
- 【NOIP2016】Day1 T3 换教室(期望DP)
题目背景 NOIP2016 提高组 Day1 T3 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程安排在 n 个时间段上. ...
- NOIP2016Day1T3换教室(floyd+期望dp)
啊...这个时间写博客,明天还要上学,整个人都不好了... 这是我写的第一道期望题hiahiahia... 题目大意就不说了QWQ 80分儿做法:先floyd,爆搜枚举哪些点取,求出答案,效率O(C( ...
- NOIP 2016 换教室(期望dp)
第一次做期望dp 并不知道每个阶段的期望之和就是整个的期望之和 所以一直卡在这 期望=代价*概率 然后注意只有申请了才算期望,否则按原来的. 这道题和前几个课程,申请的限制,当前选或不选,有关 这样很 ...
- Luogu P1850换教室【期望dp】By cellur925
题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...
随机推荐
- 【译】Exception Helper – Rethrown Exceptions
是否曾经在异步编程时引发过异常?因为调试器没有显示异常发生的位置而感到沮丧?或者在查看具有内部异常的异常时感到沮丧?调试器不容易显示该异常来自何处.从 Visual Studio 2019 16.5 ...
- WPF 设置帧率
开始仔细学习WPF了 说是动画不流畅,可以通过设置帧率解决,查了很多,都说设置Timeline.DesiredFrameRateProperty, 但都没说加到哪里,在代码很多地方加上了,统统无效.最 ...
- day52 html进阶
目录 一.分组与嵌套 二.伪类选择器 三.伪元素选择器 四.选择器优先级 五.css属性相关 1 字体属性 2 文字属性 3 背景图片 4 边框 5 display属性 6 盒子模型 7 浮动 一.分 ...
- Oracle基础介绍及常用相关sql*plus命令
以管理员身份运行Database Configuration Assistant,新建数据库实例. 要使用Oracle首先要启动Oracle服务,在任务管理器中找到服务,打开有关OracleServi ...
- 通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序
最近两天在Linux中调试.NET Core应用程序,同时我发现在Linux中调试.NET Core应用程序并不容易.一直习惯在Visual Studio中进行编码和调试.现在我想的是可以简单快速的测 ...
- 数据可视化之powerBI基础(四)深入了解PowerBI的工具提示功能
https://zhuanlan.zhihu.com/p/36804592 在PowerBI上个月的更新中,增加了工具提示功能,这项功能允许您将自己的可视化作品放置到工具提示中,通过鼠标悬停的方式来展 ...
- SpringMVC中@RequestBody接收前端传来的多个参数
在使用ajax发送请求时,如果发送的JSON数据是一个类中的不同属性,在Controller方法中使用@RequestBody会直接封装进该类中 例如: 前端部分代码 JavaScript <s ...
- bzoj3378[Usaco2004 Open]MooFest 狂欢节*
bzoj3378[Usaco2004 Open]MooFest 狂欢节 题意: n只奶牛,第i只听力为vi,坐标为xi,两只奶牛聊天时音量是max(vi,vj)*abs(xi-xj).求n(n-1)/ ...
- python利用difflib判断两个字符串的相似度
我们再工作中可能会遇到需要判断两个字符串有多少相似度的情况(比如抓取页面内容存入数据库,如果相似度大于70%则判定为同一片文章,则不录入数据库) 那这个时候,我们应该怎么判断呢? 不要着急,pytho ...
- 第一部分软件测试综述——软件测试背景【软件测试】(美)Ron Patton中文电子版
截取自:第一部分软件测试综述——软件测试背景[软件测试](美)Ron Patton中文电子版(有需要的可以关注我) 第一部分软件测试综述 对手的程序死掉叫崩溃.自己的程序死掉叫“身体不良反应(idio ...