我当年真是naive……

原题:

对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。在可以选择的课程中,有2n节
课程安排在n个时间段上。在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先
被安排在教室ci上课,而另一节课程在教室di进行。在不提交任何申请的情况下,学生们需要按时间段的顺序依次完
成所有的n节安排好的课程。如果学生想更换第i节课程的教室,则需要提出申请。若申请通过,学生就可以在第i个
时间段去教室di上课,否则仍然在教室ci上课。由于更换教室的需求太多,申请不一定能获得通过。通过计算,牛牛
发现申请更换第i节课程的教室时,申请被通过的概率是一个已知的实数ki,并且对于不同课程的申请,被通过的概率
是互相独立的。学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多m节课程进行申请。
这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申
请;牛牛可以申请自己最希望更换教室的m门课程,也可以不用完这m个申请的机会,甚至可以一门课程都不申请。因
为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从一间教室赶到另一间教室。牛牛所在
的大学有v个教室,有e条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,
通过不同的道路耗费的体力可能会有所不同。当第i(1≤i≤n-1)节课结束后,牛牛就会从这节课的教室出发,选择一
条耗费体力最少的路径前往下一节课的教室。现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体
力值的总和的期望值最小,请你帮他求出这个最小值。
1≤n≤2000,0≤m≤2000,1≤v≤300,0≤e≤90000
恩裸的概率DP,当年我naive,毕竟过去这么久了,现在就能很轻松A掉了(虽然还是看了题解……
f[i][j][k],i是时间,j是用了多少次机会,k=0/1表示用了/没用
然后搞一搞就行了
注意k=0/1最好不要表示成是在a点还是b点,这样处理起来似乎会很麻烦(因为b点好说,但如果在a点的话就要讨论是就没打算还还是申请后gg的情况
代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int rd(){int z=0,mk=1;  char ch=getchar();
 8     while(ch<'0'||ch>'9'){if(ch=='-')mk=-1;  ch=getchar();}
 9     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
10     return z*mk;
11 }
12 int n,m,nn,mm,a[2100],b[2100];  double p[2100];
13 int e[310][310];
14 double f[2100][2100][2];
15 void floyd(){
16     for(int k=1;k<=nn;++k)for(int i=1;i<=nn;++i)for(int j=1;j<=nn;++j)
17         if(e[i][k]+e[k][j]<e[i][j])  e[i][j]=e[i][k]+e[k][j];
18 }
19 int main(){//freopen("ddd.in","r",stdin);
20     memset(e,10,sizeof(e));
21     cin>>n>>m>>nn>>mm;
22     for(int i=1;i<=n;++i)  a[i]=rd();
23     for(int i=1;i<=n;++i)  b[i]=rd();
24     for(int i=1;i<=n;++i)  scanf("%lf",&p[i]);
25     int l,r,v;
26     while(mm--){  l=rd(),r=rd(),v=rd();  e[l][r]=e[r][l]=min(v,e[l][r]);}
27     for(int i=1;i<=nn;++i)  e[i][i]=0;
28     floyd();
29     for(int i=1;i<=n;++i)for(int j=0;j<=m;++j)  f[i][j][0]=f[i][j][1]=1e30;
30     f[1][0][0]=f[1][1][1]=0;
31     for(int i=2;i<=n;++i)for(int j=0;j<=m;++j){
32         f[i][j][0]=min(f[i-1][j][0]+e[a[i-1]][a[i]],f[i-1][j][1]+e[a[i-1]][a[i]]*(1-p[i-1])+e[b[i-1]][a[i]]*p[i-1]);
33         if(j>=1){
34             f[i][j][1]=min(f[i][j][1],f[i-1][j-1][0]+e[a[i-1]][a[i]]*(1-p[i])+e[a[i-1]][b[i]]*p[i]);
35             f[i][j][1]=min(f[i][j][1],f[i-1][j-1][1]+e[a[i-1]][a[i]]*(1-p[i-1])*(1-p[i])+e[a[i-1]][b[i]]*(1-p[i-1])*p[i]
36                 +e[b[i-1]][a[i]]*p[i-1]*(1-p[i])+e[b[i-1]][b[i]]*p[i-1]*p[i]);
37         }
38     }
39     double ans=1e30;
40     for(int i=0;i<=m;++i)  ans=min(ans,min(f[n][i][0],f[n][i][1]));
41     printf("%.2lf\n",ans);
42     return 0;
43 }

View Code

转载于:https://www.cnblogs.com/JSL2018/p/6550524.html

【BZOJ4720】【NOIP2016】换教室相关推荐

  1. BZOJ 4720 [Noip2016]换教室

    4720: [Noip2016]换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i( ...

  2. [NOIP2016]换教室(概率期望$DP$)

    其实吧我老早就把这题切了--因为说实话,这道题确实不难啊--李云龙:比他娘的状压DP简单多了 今天我翻以前在Luogu上写的题解时,突然发现放错代码了,然后被一堆人\(hack\)--蓝瘦啊\(ORZ ...

  3. noip2016 换教室

    题目描述 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课 ...

  4. Noip2016换教室

    传送门! Simple Description: 牛牛有$n$节课要上,每个时段都有$2$个教室在上课(具体来说是第$c[i]$与第$d[i]$个教室),牛牛在其中的一个教室上课,牛牛起初每节课分别被 ...

  5. BZOJ 4720: [Noip2016]换教室

    错是被学长挑出来的...QWQ@Monster_Yi f[i][j][0/1] 为 第i天,换j次,换1/没换0 然后大力DP #include<cstdio> #include<i ...

  6. luogu1850 [NOIp2016]换教室 (floyd+dp)

    首先floyd求出每两点间的距离(注意自己到自己的距离要设成0) 然后就是dp了 一开始照着Lifeguards的样子,钦定了一下i这个点一定要选,然后发现复杂度不对,还想了好长时间优化 然后一翻题解 ...

  7. 洛谷1850(NOIp2016) 换教室——期望dp

    题目:https://www.luogu.org/problemnew/show/P1850 状态里记录的是"上一回有没有申请",而不是"上一回申请成功否",不 ...

  8. P1850 [NOIP2016 提高组] 换教室

    P1850 [NOIP2016 提高组] 换教室 题意: 有2n个课安排在n个时间段上,每个时间段上都有两个一样的课同时在不同地方上,起初牛牛被所有课都被安排在Ci上课,另一节课在Di上课.牛牛现在想 ...

  9. 【NOIp2016 day1t3】换教室

    NOIP第一次考期望,着实吓一跳... 读入之后, 由于 n<=200 n <= 200 n,给我们建立了天然的 floyd f l o y d floyd的机会, 建完图之后,能够顺利的 ...

  10. 【DP】【期望】$P1850$换教室

    [DP][期望]\(P1850\)换教室 链接 题目描述 有 \(2n\) 节课程安排在$ n$ 个时间段上.在第 \(i\)(\(1 \leq i \leq n\))个时间段上,两节内容相同的课程同 ...

最新文章

  1. 屏显有啥硬科技可卷?让现在电视厂商这么拼
  2. 中序遍历的非递归算法
  3. redis主从配置 从而实现数据备份和读写分离
  4. 115天 起飞ing
  5. 直接在Dao层进行测试的问题
  6. VTK:IO之ExportPolyDataScene
  7. Java之品优购课程讲义_day20(5)
  8. JSP作业1--5!
  9. alter 用法集合(持续更新)
  10. Windows版JMeter下载安装
  11. PMP试题 | 每日一练,快速提分 9.3
  12. BOOST升压电路PCB布局布线
  13. 【android 高德地图出现定位失败key鉴权失败,获取 SHA1,对比是否正确】
  14. rockbox主题包安装_RockBox 安装使用参考
  15. 飞塔防火墙虚拟服务器,飞塔防火墙模拟(1):模拟器使用方法 | 网络之路博客(公众号同名)(其他平台网络之路Blog)...
  16. 【微信小程序】Java岗面试12家大厂成功跳槽
  17. unity3d俄罗斯方块源码教程+源码和程序下载
  18. vue3以及vue2自定义封装v-model
  19. 语义分割算法性能比较_语义分割江湖那些事儿
  20. 坐拥千万用户,覆盖百余行业,脉脉却挣扎在“塔西佗陷阱”

热门文章

  1. XINGNET交换机病毒防范
  2. mysql binlog的查询
  3. AKOJ-1695-找素数
  4. Windows系统运维转linux系统运维的经历
  5. 浅谈RxJava与2.0的新特性
  6. Linux系统的安装(自动引导安装、网络安装、分区选择)
  7. jQuery:has()和jQuery:contains()及jQuery:empty
  8. 写在南加州留学生遇难之后
  9. 10年追逐技术潮流,差一点儿就两手空空,竹篮打水,留给我的只有经验
  10. 关于从基于Mult-Org的视图中查询数据的问题(转)