首先floyd求出每两点间的距离(注意自己到自己的距离要设成0)

然后就是dp了

一开始照着Lifeguards的样子,钦定了一下i这个点一定要选,然后发现复杂度不对,还想了好长时间优化

然后一翻题解,直接两种状态选或不选分开算O(1)转移多好(所以年轻人不要整天满脑子都是钦定钦定的)

但为什么Lifeguards要钦定呢?因为如果你有一个删掉的状态,那我无法确定前面的到底到哪是没删的

那就是$f[i][j][1/0]=max(f[i][j][1/0]+....)$,f[i][j][0/1]是换到第i个、换了j个、i号没换/换了的最小值

....的内容大概就是这几种状态间转移的期望,讨论讨论就行了

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define lowb(x) ((x)&(-(x)))
 4 #define REP(i,n0,n) for(i=n0;i<=n;i++)
 5 #define PER(i,n0,n) for(i=n;i>=n0;i--)
 6 #define MAX(a,b) ((a>b)?a:b)
 7 #define MIN(a,b) ((a<b)?a:b)
 8 #define CLR(a,x) memset(a,x,sizeof(a))
 9 #define rei register int
10 using namespace std;
11 typedef long long ll;
12 const int maxn=2020,maxm=2020,maxv=310;
13
14 inline ll rd(){
15     ll x=0;char c=getchar();int neg=1;
16     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
17     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
18     return x*neg;
19 }
20
21 int N,M,V,E;
22 int pos[maxn][2],dis[maxn][maxn];
23 int sum[maxn];
24 double f[maxn][maxn][2],c[maxn];
25
26 void floyd(){
27     for(int i=1;i<=V;i++) dis[i][i]=0;
28     for(int i=1;i<=V;i++){
29         for(int j=1;j<=V;j++){
30             for(int k=1;k<=V;k++){
31                 if(dis[j][i]>=1e9||dis[i][k]>=1e9) continue;
32                 dis[j][k]=min(dis[j][i]+dis[i][k],dis[j][k]);
33             }
34         }
35     }
36 }
37
38 int main(){
39     //freopen(".in","r",stdin);
40     int i,j,k;
41     N=rd(),M=rd(),V=rd(),E=rd();
42     if(N==1){printf("0.00\n");return 0;}
43     for(i=1;i<=N;i++) pos[i][0]=rd();
44     for(i=1;i<=N;i++) pos[i][1]=rd();
45     for(i=1;i<=N;i++) scanf("%lf",&c[i]);
46     memset(dis,127,sizeof(dis));
47     for(i=1;i<=E;i++){
48         int a=rd(),b=rd(),c=rd();
49         dis[a][b]=min(dis[a][b],c);
50         dis[b][a]=min(dis[b][a],c);
51     }floyd();
52     for(i=1;i<=N;i++) for(j=0;j<=M;j++) f[i][j][0]=f[i][j][1]=1e9;
53     f[1][0][0]=f[1][1][0]=f[1][1][1]=0;
54     for(i=2;i<=N;i++){
55         for(j=0;j<=min(i,M);j++){
56             f[i][j][0]=min(f[i-1][j][0]+dis[pos[i-1][0]][pos[i][0]],
57                            f[i-1][j][1]+dis[pos[i-1][0]][pos[i][0]]*(1-c[i-1])+dis[pos[i-1][1]][pos[i][0]]*c[i-1]);
58             if(j){
59                 f[i][j][1]=min(f[i-1][j-1][0]+dis[pos[i-1][0]][pos[i][0]]*(1-c[i])+dis[pos[i-1][0]][pos[i][1]]*c[i],
60                                f[i-1][j-1][1]+(dis[pos[i-1][0]][pos[i][0]]*(1-c[i])+dis[pos[i-1][0]][pos[i][1]]*c[i])*(1-c[i-1])+
61                                               (dis[pos[i-1][1]][pos[i][0]]*(1-c[i])+dis[pos[i-1][1]][pos[i][1]]*c[i])*c[i-1]);
62             }
63         }
64     }
65     double ans=1e9;
66     for(i=0;i<=M;i++) ans=min(ans,min(f[N][i][0],f[N][i][1]));
67     printf("%.2lf\n",ans);
68     return 0;
69 }

转载于:https://www.cnblogs.com/Ressed/p/9696075.html

luogu1850 [NOIp2016]换教室 (floyd+dp)相关推荐

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

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

  2. BZOJ 4720 [Noip2016]换教室

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

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

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

  4. noip2016 换教室

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

  5. Noip2016换教室

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

  6. BZOJ 4720: [Noip2016]换教室

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

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

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

  8. 【NOIp2016 day1t3】换教室

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

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

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

最新文章

  1. EntityFramework SaveChange()方法不能更新的问题
  2. 黑马java教程是什么_Java教程:揭秘什么是面向接口编程
  3. android手机短信拦截器,垃圾短信退订套路深 手机上装拦截软件是可行方法
  4. 类欧几里得算法详细推导过程(附带模板)
  5. android retrofit 2.0公共参数,Retrofit2.0 添加公共参数
  6. Myeclipse快键键
  7. Java 高阶 —— try/catch
  8. bzoj 1861 treap
  9. 有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代
  10. 使用Audition将PCM格式转Wav格式
  11. 如何用数据进行产品运营
  12. python RGB与LCH互转 算法
  13. 软件智能:aaas系统 基于本体论的AI通用框架
  14. 自动(智能)驾驶 | 傲酷4D毫米波雷达报告记录分享
  15. 微信小程序系列2——小程序页面渲染和逻辑的关系
  16. 网页如何与小程序交互通信
  17. python解决数学建模发电商机组调度问题
  18. 2022/12/1 组会
  19. IDEA 出现 Exception in thread main java.lang.OutOfMemoryError: Java heap space 解决方式
  20. 【MySQL 8.0 OCP 1Z0-908认证考试】题库精讲--第五讲mysqlbinlog与mysqldump(下)

热门文章

  1. linux 取文件字节数,如何在Linux上的C中获取文件中的字符数(而不是字节数)
  2. 985计算机只考数据结构,初试只考数据结构的985院校
  3. 分布式mysql 不支持存储过程_分布式数据库VoltDB对存储过程的支持
  4. 安卓9.0官方系统升级包_想升级鸿蒙系统都来看看!华为新系统升级名单曝光:有你手机吗?...
  5. boot idea无法识别spring_IDEA 的这款插件真是逆天了,代码那都不是事
  6. c++ 基数排序算法_基数排序算法– C / C ++实现的基础
  7. 如何在Ubuntu 18.04上安装Elasticsearch Logstash Kibana(Elastic Stack)
  8. tomcat配置重定向_在Tomcat上配置SSL以及从HTTP到HTTPS的设置自动重定向的步骤
  9. fork/join框架Java
  10. Java大厂面试题:从 JVM 角度说进程和线程之间的关系