【NOIP2016】换教室(DP,期望)

题意:

对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程。

在可以选择的课程中,有2n节课程安排在n个时间段上。在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程同时在不同的地点进行, 其中, 牛牛预先被安排在教室 ci上课, 而另一节课程在教室 di进行。

在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程。如果学生想更换第i节课程的教室,则需要提出中情。若申请通过,学生就可以在第 i个时间段去教室 di上课, 否则仍然在教室 ci上课。

由于更换教室的需求太多, 申请不一定能获得通过。 通过计算, 牛牛发现申请更换第 i节课程的教室时, 中情被通过的概率是一个已知的实数 ki, 并且对于不同课程的申请, 被通过的概率是互相独立的。

学校规定, 所有的申请只能在学期开始前一次性提交, 并且每个人只能选择至多m节课程进行申请。 这意味着牛牛必须一次性决定是否申请更换每节课的教室, 而不能根据某些课程的申请结果来决定其他课程是否申请; 牛牛可以申请白己最希望更换教室的 m门课程,也可以不用完这m个中情的机会,甚至可以一门课程都不申请。

因为不同的课程可能会被安排在不同的教室进行, 所以牛牛需要利用课问时间从一间教室赶到另一间教室。

牛牛所在的大学有 v个教室,有 e条道路。每条道路连接两间教室, 并且是可以双向通行的。 由于道路的长度和拥;i者程度不同, 通过不同的道路耗费的体力可能会有所不同。当第i ( 1≤i≤n-1 )节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。

现在牛牛想知道,申请哪几门课程可以使他因在教室问移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值

保证1≤n≤2000, 0≤m≤2000, 1≤v≤300, 0≤ e≤90000。

思路:萎靡的期望DP

dp[i,j,0/1]表示前i门申请j门(不一定通过),最后一门是否申请的最小期望

分四种情况讨论

V打成N毁一生

 1 var dp:array[0..2100,0..2100,0..1]of double;
 2     f:array[0..2100,0..2100]of double;
 3     c,d:array[0..2100]of longint;
 4     g:array[0..2100]of double;
 5     n,m,v1,e1,i,j,k,x,y,z:longint;
 6     ans:double;
 7
 8 function min(x,y:double):double;
 9 begin
10  if x<y then exit(x);
11  exit(y);
12 end;
13
14 begin
15
16  readln(n,m,v1,e1);
17  for i:=1 to n do read(c[i]);
18  for i:=1 to n do read(d[i]);
19  for i:=1 to n do read(g[i]);
20  for i:=0 to v1 do
21   for j:=0 to v1 do f[i,j]:=1<<62;
22  for i:=0 to v1 do f[i,i]:=0;
23  for i:=1 to v1 do begin f[0,i]:=0; f[i,0]:=0; end;
24   for i:=1 to e1 do
25  begin
26   read(x,y,z);
27   f[x,y]:=min(f[x,y],z);
28   f[y,x]:=min(f[y,x],z);
29  end;
30  for i:=1 to v1 do
31   for j:=1 to v1 do
32    for k:=1 to v1 do
33     if(i<>j)and(i<>k)and(j<>k) then f[j,k]:=min(f[j,k],f[j,i]+f[i,k]);
34  for i:=0 to n do
35   for j:=0 to m do
36   begin
37    dp[i,j,0]:=1<<62; dp[i,j,1]:=1<<62;
38   end;
39  dp[0,0,0]:=0; //dp[0,0,1]:=0;
40  g[0]:=0;
41  for i:=0 to n-1 do
42   for j:=0 to m do
43   begin
44    dp[i+1,j,0]:=min(dp[i+1,j,0],dp[i,j,0]+f[c[i],c[i+1]]);
45
46    if j+1<=m then dp[i+1,j+1,1]:=min(dp[i+1,j+1,1],dp[i,j,0]+g[i+1]*f[c[i],d[i+1]]
47                                    +(1-g[i+1])*f[c[i],c[i+1]]);
48
49    dp[i+1,j,0]:=min(dp[i+1,j,0],dp[i,j,1]+g[i]*f[d[i],c[i+1]]
50                                +(1-g[i])*f[c[i],c[i+1]]);
51
52    if j+1<=m then dp[i+1,j+1,1]:=min(dp[i+1,j+1,1],dp[i,j,1]+
53                       g[i]*g[i+1]*f[d[i],d[i+1]]+
54                       g[i]*(1-g[i+1])*f[d[i],c[i+1]]+
55                       (1-g[i])*g[i+1]*f[c[i],d[i+1]]+
56                       (1-g[i])*(1-g[i+1])*f[c[i],c[i+1]]);
57
58
59   end;
60  ans:=1<<62;
61  for i:=0 to m do ans:=min(ans,min(dp[n,i,0],dp[n,i,1]));
62  writeln(ans:0:2);
63
64 end.
时间: 2025-01-08 22:52:08

【NOIP2016】换教室(DP,期望)的相关文章

bzoj 4720: [Noip2016]换教室【期望dp】

状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) #include<iostream> #include<cstdio> using namespace std; const int N=2005; int n,m,v,e,c[N],d[N]; double k[N],f[N][N][2],ans=1e9,a[N][N],z; int read() { int r=0,f=1; char p=getchar(); wh

[NOIP2016]换教室 D1 T3 Floyed+期望DP

[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程同时在不同的地点进行, 其中, 牛牛预先被安排在教室 ci上课, 而另一节课程在教室 di进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出中情.若申请通过,学生

BZOJ 4720 [Noip2016]换教室

4720: [Noip2016]换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室ci上课,而另一节课程在教室di进行.在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出申请.若申请通过,学生就可以在第i个时间段去教室

[NOIP2016]换教室 题解(奇怪的三种状态)

2558. [NOIP2016]换教室 [题目描述] 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1<i<n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室ci上课,而另一节课程在教室di进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出申请.若申请通过,学生就可以在第i个时间段去教室di

Noip2016 换教室(数学期望入门)

题意:有2n个课程安排在n个时间段上,在第i个时间被安排在ci教室上课,但牛牛可以申请换教室,到di教室上课,但只有pi的可能成功.学校有v个教室,e条道路,每条路双向连通,每条路都会消耗一定的体力wi(保证每个教室可以互相到达),问牛牛应该怎么安排,才能使总花费的体力的期望值最小. 输入格式: 第一行四个整数n,m,v,e.n表示时间短的数量:m表示最多可以申请更换教室的数量:v表示教室的数量:e表示道路的数量. 第二行n个正整数,第i个表示ci: 第三行n个正整数,第i个表示di: 第四行n

JZYZOJ1457 [NOIP2016]换教室 期望dp 动态规划 floyd算法 最短路

http://172.20.6.3/Problem_Show.asp?id=1457 我不知道为什么我倒着推期望只有80分,所以我妥协了,我对着题解写了个正的,我有罪. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #include<iostream> 6 #include<queue> 7 using namespac

noip2016 换教室 概率+dp

非常好的dp,继续加油练习dp啊 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) using namespace std; const int N=2e3+50; const double inf=1e8+5; const int V=305; int n,m,v,e,c[N],d[N],g[V][V]; double k[N],f[N][N][2],ans; inline int rea

noip2016 换教室

题目描述 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程同时在不同的地点进行, 其中, 牛牛预先被安排在教室 ci上课, 而另一节课程在教室 di进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出中情.若申请通过,学生就可以在第 i个时间段去教室 di上课, 否则仍然在教

【uoj262】 NOIP2016—换教室

http://uoj.ac/problem/262 (题目链接) 题意 有${n}$个时间段,第${i}$个时间段可以选择在${c_i}$教室上课,也可以选择申请换课,有${k_i}$概率申请通过,在${d_i}$上课,另外${1-k_i}$的概率留在${c_i}$教室. 总共有${v}$个教室,${e}$条路径双向联通教室${x_i}$和${y_i}$,路径有权值${w_i}$.在课间时(相邻两个时间段的间隔中),你要从上一个教室走最短路径到下一个教室. 现在你有${m}$次申请机会,只能提前

BZOJ P4720[Noip2016]换教室____solution

题目太长不表 <--无形传送,最为致命 学习一点数学期望的基础,预处理最短路,然后加上DP即可.(废话) 理解决策和结果的差别: 在这里每阶段的决策有两个:申请|不申请 结果有两个:换|不换 然而二者不是一一对应的关系: 而且决策意味着状态,结果只用于计算期望 为什么呢 因为答案要的就是对于某种决策组的期望 于是状态的设计应该是分为申请|不申请, 然后计算期望时讨论申请成不成功: 状态:f[i,j,0/1]讨论前i节课,申请j次,第三维=[第i节申请了] 方程: //f[i][j][0]=f[i