【NOIP16提高组】换教室
【题目链接】
【算法】
概率DP
先跑一遍floyed,求出每个教室之间的最短路径,存在数组dist[][]中,时间复杂度O(V^3)
设计状态,f[i][j][k]表示当前选到第i个教室,已经选了j个教室,当前这个教室选不选(0..1)
那么,状态转移方程是什么呢?
假设当前选到第i个教室,已经选了j个教室,那么,如果不选这个教室,则状态转移方程为
f[i][j][0] = max{f[i-1][j][0]+dist[c[i-1]][c[i]],f[i-1][j][1]+dist[c[i-1]][c[i]]*(1-k[i-1])+dist[d[i-1]][c[i]]*k[i-1]}
如果选这个教室,则状态转移方程是
f[i][j][1] = min{f[i-1][j-1][0]+dist[c[i-1]][d[i]]*k[i]+dist[c[i-1]][c[i]]*(1-k[i],f[i-1][j-1][1]+dist[d[i-1]][d[i]]*k[i-1]*k[i]+dist[c[i-1]][d[i]]*(1-k[i-1])*k[i]+dist[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i])+dist[d[i-1]][c[i]]*k[i-1]*(1-k[i])}
于是这道题便迎刃而解了!
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXN 2000
#define MAXV 300 int i,j,k,n,m,v,e,a,b,w;
int dist[MAXV+][MAXV+],c[MAXN+],d[MAXN+];
double P[MAXN+],dp[MAXN+][MAXN+][];
double ans = 2e9; template <typename T> inline void read(T &x) {
int f=; x=;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = x * + c - '';
x *= f;
} template <typename T> inline void write(T x) {
if (x < ) { putchar('-'); x = -x; }
if (x > ) write(x/);
putchar(x%+'');
} template <typename T> inline void writeln(T x) {
write(x);
puts("");
} int main() { read(n); read(m); read(v); read(e);
for (i = ; i <= v; i++) {
for (j = ; j <= v; j++) {
if (i != j)
dist[i][j] = 2e9;
}
}
for (i = ; i <= n; i++) read(c[i]);
for (i = ; i <= n; i++) read(d[i]);
for (i = ; i <= n; i++) cin >> P[i];
for (i = ; i <= e; i++) {
read(a); read(b); read(w);
dist[a][b] = min(dist[a][b],w);
dist[b][a] = min(dist[b][a],w);
} for (k = ; k <= v; k++) {
for (i = ; i <= v; i++) {
if (i == k) continue;
if (dist[i][k] == 2e9) continue;
for (j = ; j <= v; j++) {
if (dist[k][j] == 2e9) continue;
if ((i == j) || (k == j)) continue;
dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]);
}
}
} for (i = ; i <= n; i++) {
for (j = ; j <= m; j++) {
dp[i][j][] = dp[i][j][] = 2e9;
}
} dp[][][] = ; dp[][][] = ;
for (i = ; i <= n; i++) {
dp[i][][] = dp[i-][][] + dist[c[i-]][c[i]];
for (j = ; j <= min(i,m); j++) {
dp[i][j][] = min(dp[i-][j][]+dist[c[i-]][c[i]],dp[i-][j][]+dist[c[i-]][c[i]]*(1.0-P[i-])+dist[d[i-]][c[i]]*P[i-]);
dp[i][j][] = min(dp[i-][j-][]+dist[c[i-]][d[i]]*P[i]*1.0+dist[c[i-]][c[i]]*(1.0-P[i]),
dp[i-][j-][]+
dist[d[i-]][d[i]]*P[i-]*P[i]*1.0+
dist[c[i-]][d[i]]*(1.0-P[i-])*P[i]+
dist[c[i-]][c[i]]*(1.0-P[i-])*(1.0-P[i])+
dist[d[i-]][c[i]]*P[i-]*(-P[i])*1.0);
}
} for (i = ; i <= m; i++) ans = min(ans,min(dp[n][i][],dp[n][i][]));
cout<< fixed << setprecision() << ans << endl; return ; }
【NOIP16提高组】换教室的更多相关文章
- [NOIp2016提高组]换教室
题目大意: 有n节课,第i节课在c[i]上课,同时d[i]也有一节课d[i]. 你有权利向教务处发出m次申请把自己的教室改到d[i],相应的批准概率是k[i]. 教室是图上的一些点,其中每条边都有边权 ...
- Luogu P1850 [NOIp2016提高组]换教室 | 期望dp
题目链接 思路: <1>概率与期望期望=情况①的值*情况①的概率+情况②的值*情况②的概率+--+情况n的值*情况n的概率举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地 ...
- 洛谷 1850 NOIP2016提高组 换教室
[题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...
- 题解 P1850 [NOIP2016 提高组] 换教室
做完这道题才略微感觉自己懂了一点关于概率与期望的知识QAQ... 一:关于概率与期望的定义 转载节选于blog 1.什么是数学期望? 数学期望亦称期望.期望值等.在概率论和统计学中,一个离散型随机变量 ...
- [NOIp2012提高组]借教室
OJ题号:洛谷1083 思路:ZKW线段树 #include<cstdio> #include<cctype> #include<algorithm> inline ...
- 【分块】【常数优化】【Orz faebdc】洛谷 P1083 NOIP2012提高组 借教室
分块90分. By AutSky_JadeK [重点在下面] #include<cstdio> #include<cmath> using namespace std; #de ...
- 【洛谷P1850】换教室[2016NOIP提高组]
换教室 期望DP 状态: f[i][j][0/1]表示前i节课 提交j个申请 第i个教室不申请/申请(为了确定当前教室,方便转移) 的最小期望 方程: f[i][j][0]=min(f[i-1][j] ...
- [NOIP2012] 提高组 洛谷P1083 借教室
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...
- Codevs 1217 借教室 2012年NOIP全国联赛提高组
1217 借教室 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在大学期间,经常需要租借教 ...
随机推荐
- pandaboard串口通信调试
1.在PC上的pyserial程序,到pandaboard后报错,读取和写入会报错 2.使用的是pandaboard的ttyO2串口 3.ls -l /dev/ttyO2,发现是tty,而不是dial ...
- IntelliJ IDEA出现:This file is indented with tabs instead of 4 spaces的问题解决
根据阿里巴巴Java开发手册,不能使用Tab字符,改成4个字符,设置如下: 注意:是不选择! 一定要选择这个:
- 三角网格上的寻路算法Part.1—Dijkstra算法 等
http://www.cnblogs.com/chnhideyoshi/p/AStar.html
- android 获得屏幕宽度和高度
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- Centos 6.x 安装Python 3.4.3
[root@squid ~]# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf [root@squid ~]# grep keepcache /e ...
- 用df命令显示磁盘使用量和占用率。
使用“df -k”命令,以k为单位显示磁盘使用量和占用率. root@gsg43:/tmp# df -kFilesystem 1K-blocks Used Available Use% ...
- AppCan移动应用开发平台新增9个超有用插件(内含演示样例代码)
使用AppCan平台进行移动开发.你所须要具备的是Html5+CSS +JS前端语言基础.此外.Hybrid混合模式应用还需结合原生语言对功能模块进行封装,对于没有原生基础的开发人员,怎样实现App里 ...
- C#中使用byte[]数据,生成Bitmap
/// <summary> /// 使用byte[]数据,生成256色灰度 BMP 位图 /// </summary> /// <param name="ori ...
- 一篇很好的讲解SIFT算法的文章
http://blog.csdn.net/zddblog/article/details/7521424
- PostgreSQL源码解读 基础结构 node
一.node节点的定义 源代码路径postgresql-9.2.3/src/include/nodes/nodes.h 在查询解析SQL的查询部分,要用到大量的结构体,许多函数处理的逻辑类似,就是传入 ...