luoguP1850 换教室
luoguP1850 换教室
链接
https://www.luogu.org/problemnew/show/P1850
思路
状态很显然就是f[n][k][0/1]
前i次,用了k次机会,当前是在哪个教室
转移就很、、了。
每次转移i的时候,一定是从i的两个可能的教室来的。
那就有四种可能的方式了。
先考虑不换的情况,即\(k = 0\)时的情况
\(C1 = c[i - 1], C2 = d[i - 1], C3 = c[i], C4 = d[i]\)
\(mp[i][j]\)表示\(i,j\)间的最短路
\(dp[i][j][0] =min\begin{cases} dp[i - 1][j][0] + mp[C1][C3]\\dp[i - 1][j][1] + mp[C1][C3] * (1 - k[i - 1]) + mp[C2][C3] * k[i - 1]\end{cases}\)
显然如果\(i-1\)时没有换教室那么,\(i - 1\)到\(i\)只有一种情况就是都不换教室,如果\(i - 1\)时换了教室那么就有两种情况\(i - 1\)换成功了,或者没换成功所以就是对应的路径长乘上对应的概率
$dp[i][j][1] =min\begin{cases} dp[i - 1][j - 1][0] + mp[C1][C3] * (1 - k[i]) + mp[C1][C4] * k[i]\dp[i - 1][j - 1][1] + mp[C2][C4] * k[i] * k[i - 1] + mp[C2][C3] * k[i - 1] * (1 - k[i]) + mp[C1][C4] * (1 - k[i - 1]) * k[i] + mp[C1][C3] * (1 - k[i - 1]) * (1 - k[i])\end{cases} $
ORZ 大佬
错误
数组开小了
floyd的k写到外边了
代码
#include <bits/stdc++.h>
using namespace std;
const int N=2e3+7,M=307;
const double inf=10000000000000000000.0;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s<='9'&&s>='0';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,v,e,c[N],d[N],dis[M][M];
double k[N],f[N][N][2];
int main() {
n=read(),m=read(),v=read(),e=read();
for(int i=1;i<=n;++i) c[i]=read();
for(int i=1;i<=n;++i) d[i]=read();
for(int i=1;i<=n;++i) scanf("%lf",&k[i]);
for(int i=1;i<=v;++i) {
for(int j=1;j<=v;++j) dis[i][j]=0x3f3f3f3f;
dis[i][i]=0;
}
for(int i=1;i<=e;++i) {
int a=read(),b=read(),val=read();
dis[a][b]=dis[b][a]=min(dis[a][b],val);
}
for(int mmp=1;mmp<=v;++mmp)
for(int i=1;i<=v;++i)
for(int j=1;j<=v;++j)
dis[i][j]=min(dis[i][j],dis[i][mmp]+dis[mmp][j]);
for(int i=1;i<=n;++i)
for(int j=0;j<=m;++j)
f[i][j][0]=f[i][j][1]=inf;
f[1][0][0]=f[1][1][1]=0;
for(int i=2;i<=n;++i) {
for(int j=0;j<=m;++j) {
f[i][j][0]=min(f[i-1][j][0]+dis[c[i-1]][c[i]],
f[i-1][j][1]+k[i-1]*dis[d[i-1]][c[i]]+(1.0-k[i-1])*dis[c[i-1]][c[i]]);
if(j)
f[i][j][1]=min(f[i-1][j-1][0]+k[i]*dis[c[i-1]][d[i]]+(1.0-k[i])*dis[c[i-1]][c[i]],
f[i-1][j-1][1]+k[i]*k[i-1]*dis[d[i-1]][d[i]]+
k[i]*(1.0-k[i-1])*dis[c[i-1]][d[i]]+
(1.0-k[i])*k[i-1]*dis[d[i-1]][c[i]]+
(1.0-k[i])*(1.0-k[i-1])*dis[c[i-1]][c[i]]);
}
}
double ans=inf;
for(int i=0;i<=m;++i) ans=min(ans,min(f[n][i][0],f[n][i][1]));
printf("%.2lf\n",ans);
return 0;
}
luoguP1850 换教室的更多相关文章
- 【bzoj4720】[NOIP2016]换教室
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...
- [NOIP2016]换教室 D1 T3 Floyed+期望DP
[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...
- [BZOJ 4720][NOIP 2016] 换教室
记得某dalao立了"联赛要是考概率期望我直播吃键盘"的$flag$然后就有了这道题233333 4720: [Noip2016]换教室 Time Limit: 20 Sec M ...
- [NOIp2016] 换教室
题目类型:期望\(DP\) 传送门:>Here< 题意:现有\(N\)个时间段,每个时间段上一节课.如果不申请换教室,那么时间段\(i\)必须去教室\(c[i]\)上课,如果申请换课成功, ...
- bzoj4720 / P1850 换教室(Floyd+期望dp)
P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...
- BZOJ 4720 [Noip2016]换教室
4720: [Noip2016]换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i( ...
- 洛谷 P1850 换教室 解题报告
P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1≤i≤n) ...
- P1850 换教室
P1850 换教室 现在有一张图, 有 \(v <= 300\) 个节点 你需要从 \(c_{1}\) 到 \(c_{2}\) 到 \(c_{n} (n <= 2000)\) 现在你有 \ ...
- 【BZOJ】4720: [Noip2016]换教室
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1690 Solved: 979[Submit][Status ...
随机推荐
- php操作redis案例
<?php //实例化 $redis = new Redis(); //连接服务器 //默认端口是6379,可不写 $redis->connect( ...
- java 中的 Comparable 和 Comparator 与 Iterable 和 Iterator
Comparable 和 Comparator Comparable 和 Comparator 是两个关系不大的类,其分别侧重于不同的方面. 其中,接口 Comparable<T> 强行对 ...
- ruby 基础知识2 - 区块 block
原文 1. block中的 yield 与遍历 5.times do |i| puts i end 或者 def my_times(n) i = 0 while n > i i += 1 yie ...
- Listen error 错误和 limit of inotify watches was reached
今天在生产环境中报错rails c中报了一个错误: FATAL: Listen error: unable to monitor directories for changes. Visit http ...
- 每个JavaScript程序员都需要知道的5个数组方法
Array.forEach() .forEach() 方法能够方便的让你 遍历数组里的每个元素,你可以在回调函数里对每个元素进行操作..forEach()方法没有返回值,你不需要在回调函数里写retu ...
- linux中时间命令详解
DATE hling@hling:~$ date2018年 04月 11日 星期三 19:43:04 CSThling@hling:~$ date +%Y%M%d20184311hling@hling ...
- vue引入第三方的js文件
在最近开发中,遇到了vue框架配合openlayers做gis功能的一个模块.过程中要求引用第三方的单独js文件.嗯,解决如下: 把整体js文件用函数abc()封装起来,在需要用到的模块用var ob ...
- awt
public class MouseTest extends Frame{ private static final long serialVersionUID = 54376853365952763 ...
- [daily][fedora][netctl][nmcli] 设置笔记本为台式机网关
TAG:将一个网卡动态增减到网桥里的配置 场景是这样的. 我的笔记本无线网卡用来访问互联网.OS里面有一个birdge用来链接所有的虚拟机帮助虚拟机上网. 现在有了一台台式机.台式机用来做hyperv ...
- websocket作用
1.即时通讯 web即时通讯(网页的QQ,聊天系统等)可以通过websocket实现. 2.轮询 web开发中,有时需要通过轮询(比如时间间隔5秒)去服务器读取数据. 使用HTTP协议向服务器发送re ...