【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\)的当事人,他们考前奶联赛一定不会考概率 ...
随机推荐
- 如何查询到你的wifi所在的公网ip?
浏览器中输入:ip138.com 即可查询到.
- mysql修改密码的三种方式
- VSCode下,项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
vscode下webpack错误:无法将“webpack”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 解决方法: 1.因为 ...
- pip install scrapy报错:error: Unable to find vcvarsall.bat解决方法
今天在使用pip install scrapy 命令安装Scrapy爬虫框架时,出现了很让人头疼的错误,错误截图如下: 在网上查找解决方法时,大致知道了问题的原因.是因为缺少C语言的编译环境,其中一种 ...
- java 面向对象(二十六):枚举类的使用
1. 枚举类的说明:* 1.枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类* 2.当需要定义一组常量时,强烈建议使用枚举类* 3.如果枚举类中只一个对象,则可以作为单例模式的实现方式. ...
- 数据可视化之powerBI入门 (一)认识PowerBI
来自 https://zhuanlan.zhihu.com/p/64144024 Power BI是什么? Power BI是微软推出的数据分析和可视化工具,我们先来看看微软官方是怎么介绍的: Po ...
- 临时解决GitHub的raw.githubusercontent.com无法连接问题
http://qjzd.net:3000/topic/5e48cc33dcf06d6a181ffb81 查询真实IP 通过IPAddress.com首页,输入raw.githubusercontent ...
- redis(十):Redis 列表(List)
Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (4294967 ...
- vue 仿掘金评论列表
先来个最终效果 代码: template代码: <template> <div class="main"> <div class="titl ...
- Python Ethical Hacking - BACKDOORS(2)
Refactoring - Creating a Listener Class #!/usr/bin/env python import socket class Listener: def __in ...