首先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=,maxm=,maxv=;
  13.  
  14. inline ll rd(){
  15. ll x=;char c=getchar();int neg=;
  16. while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
  17. while(c>=''&&c<='') x=x*+c-'',c=getchar();
  18. return x*neg;
  19. }
  20.  
  21. int N,M,V,E;
  22. int pos[maxn][],dis[maxn][maxn];
  23. int sum[maxn];
  24. double f[maxn][maxn][],c[maxn];
  25.  
  26. void floyd(){
  27. for(int i=;i<=V;i++) dis[i][i]=;
  28. for(int i=;i<=V;i++){
  29. for(int j=;j<=V;j++){
  30. for(int k=;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==){printf("0.00\n");return ;}
  43. for(i=;i<=N;i++) pos[i][]=rd();
  44. for(i=;i<=N;i++) pos[i][]=rd();
  45. for(i=;i<=N;i++) scanf("%lf",&c[i]);
  46. memset(dis,,sizeof(dis));
  47. for(i=;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=;i<=N;i++) for(j=;j<=M;j++) f[i][j][]=f[i][j][]=1e9;
  53. f[][][]=f[][][]=f[][][]=;
  54. for(i=;i<=N;i++){
  55. for(j=;j<=min(i,M);j++){
  56. f[i][j][]=min(f[i-][j][]+dis[pos[i-][]][pos[i][]],
  57. f[i-][j][]+dis[pos[i-][]][pos[i][]]*(-c[i-])+dis[pos[i-][]][pos[i][]]*c[i-]);
  58. if(j){
  59. f[i][j][]=min(f[i-][j-][]+dis[pos[i-][]][pos[i][]]*(-c[i])+dis[pos[i-][]][pos[i][]]*c[i],
  60. f[i-][j-][]+(dis[pos[i-][]][pos[i][]]*(-c[i])+dis[pos[i-][]][pos[i][]]*c[i])*(-c[i-])+
  61. (dis[pos[i-][]][pos[i][]]*(-c[i])+dis[pos[i-][]][pos[i][]]*c[i])*c[i-]);
  62. }
  63. }
  64. }
  65. double ans=1e9;
  66. for(i=;i<=M;i++) ans=min(ans,min(f[N][i][],f[N][i][]));
  67. printf("%.2lf\n",ans);
  68. return ;
  69. }

luogu1850 [NOIp2016]换教室 (floyd+dp)的更多相关文章

  1. bzoj4720: [Noip2016]换教室(期望dp)

    4720: [Noip2016]换教室 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1294  Solved: 698[Submit][Status ...

  2. 【bzoj4720】[NOIP2016]换教室 期望dp

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

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

    http://172.20.6.3/Problem_Show.asp?id=1457 我不知道为什么我倒着推期望只有80分,所以我妥协了,我对着题解写了个正的,我有罪. #include<cst ...

  4. 【bzoj4720】[Noip2016]换教室 期望dp+最短路

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

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

    题目:https://www.luogu.org/problemnew/show/P1850 状态里记录的是”上一回有没有申请“,而不是”上一回申请成功否“,不然“申请 j 次”就没法转移了. dou ...

  6. [NOIP2016]换教室 期望dp

    先弗洛伊德,然后把状态拆分遗传 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  7. 洛谷P1850 [noip2016]换教室——期望DP

    题目:https://www.luogu.org/problemnew/show/P1850 注释掉了一堆愚蠢,自己还是太嫩了... 首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选 ...

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

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

  9. BZOJ 4720 [Noip2016]换教室

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

随机推荐

  1. [Oracle][Partition][Controlfile]Partition 操作是否和 Controlfile有关?

    Partition 操作是否和 Controlfile有关? 通过实验来判断: 对比 Partition 前后的操作,看看controlfile 的dump 信息中是否有记录,结果发现没有记录在 co ...

  2. java基础(个人学习笔记) A

    1.       声明long类型的变量 需要在数值的末尾+l/L.(不加L的话,貌似默认就是int型了.当给long赋值一个超过int范围的值的时候,会出问题.) 2.  package java_ ...

  3. 【JVM.8】类加载及执行子系统的案例与实战

    一. 案例分析 1. Tomcat:正统的类加载器架构 主流的Java Web服务器,如Tomcat.Jetty.WebLogic.WebSphere或其他服务器,都实现了自己定义的类加载器(一般都不 ...

  4. iOS开发简记(1):指定APP的图标与启动图

    各位兄弟姐妹们,早上好,本人花了将近一个月的时间打造了一个完整的IOS版的App, 期间包括开发,测试,上线审核,现在花点时间把实现的过程分享给大家,“知音”app功能简单,适合对象为初学者,后面我会 ...

  5. [UWP 自定义控件]了解模板化控件(2.1):理解ContentControl

    UWP的UI主要由布局容器和内容控件(ContentControl)组成.布局容器是指Grid.StackPanel等继承自Panel,可以拥有多个子元素的类.与此相对,ContentControl则 ...

  6. C#大型电商项目优化(二)——嫌弃EF与抛弃EF

    上一篇博文中讲述了使用EF开发电商项目的代码基础篇,提到EF后,一语激起千层浪.不少园友纷纷表示:EF不适合增长速度飞快的互联网项目,EF只适合企业级应用等等. 也有部分高手提到了分布式,确实,性能优 ...

  7. Nginx入门【转】

    原文地址:http://blog.csdn.net/u012486840/article/details/53098890 1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上 ...

  8. D. Mysterious Crime

    链接 [http://codeforces.com/contest/1043/problem/D] 题意 给你一个m*n的矩阵(m<=10,n<=1e5), 每一行的数字是1到n里不同的数 ...

  9. 20150421 作业5 四则运算 测试与封装 5.1 5.2(doing)

    结伴队友:王佳寧,他的博客地址:http://www.cnblogs.com/paopaotai/ 5.2 黑白盒測試 測試項目名稱 黑盒測試 測試人員 葉子鵬&王佳寧 測試編號 測試頁面 測 ...

  10. 虚拟机Linux(centos)系统能ping通主机,主机无法ping通Linux解决方案

    本文引用:https://blog.csdn.net/clean_water/article/details/53023308 三个步骤: 第一步:虚拟机网络连接方式选择Nat 第二步.关闭liunx ...