首先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号没换/换了的最小值

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

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define lowb(x) ((x)&(-(x)))
#define REP(i,n0,n) for(i=n0;i<=n;i++)
#define PER(i,n0,n) for(i=n;i>=n0;i--)
#define MAX(a,b) ((a>b)?a:b)
#define MIN(a,b) ((a<b)?a:b)
#define CLR(a,x) memset(a,x,sizeof(a))
#define rei register int
using namespace std;
typedef long long ll;
const int maxn=,maxm=,maxv=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,M,V,E;
int pos[maxn][],dis[maxn][maxn];
int sum[maxn];
double f[maxn][maxn][],c[maxn]; void floyd(){
for(int i=;i<=V;i++) dis[i][i]=;
for(int i=;i<=V;i++){
for(int j=;j<=V;j++){
for(int k=;k<=V;k++){
if(dis[j][i]>=1e9||dis[i][k]>=1e9) continue;
dis[j][k]=min(dis[j][i]+dis[i][k],dis[j][k]);
}
}
}
} int main(){
//freopen(".in","r",stdin);
int i,j,k;
N=rd(),M=rd(),V=rd(),E=rd();
if(N==){printf("0.00\n");return ;}
for(i=;i<=N;i++) pos[i][]=rd();
for(i=;i<=N;i++) pos[i][]=rd();
for(i=;i<=N;i++) scanf("%lf",&c[i]);
memset(dis,,sizeof(dis));
for(i=;i<=E;i++){
int a=rd(),b=rd(),c=rd();
dis[a][b]=min(dis[a][b],c);
dis[b][a]=min(dis[b][a],c);
}floyd();
for(i=;i<=N;i++) for(j=;j<=M;j++) f[i][j][]=f[i][j][]=1e9;
f[][][]=f[][][]=f[][][]=;
for(i=;i<=N;i++){
for(j=;j<=min(i,M);j++){
f[i][j][]=min(f[i-][j][]+dis[pos[i-][]][pos[i][]],
f[i-][j][]+dis[pos[i-][]][pos[i][]]*(-c[i-])+dis[pos[i-][]][pos[i][]]*c[i-]);
if(j){
f[i][j][]=min(f[i-][j-][]+dis[pos[i-][]][pos[i][]]*(-c[i])+dis[pos[i-][]][pos[i][]]*c[i],
f[i-][j-][]+(dis[pos[i-][]][pos[i][]]*(-c[i])+dis[pos[i-][]][pos[i][]]*c[i])*(-c[i-])+
(dis[pos[i-][]][pos[i][]]*(-c[i])+dis[pos[i-][]][pos[i][]]*c[i])*c[i-]);
}
}
}
double ans=1e9;
for(i=;i<=M;i++) ans=min(ans,min(f[N][i][],f[N][i][]));
printf("%.2lf\n",ans);
return ;
}

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. [Oralce][InMemory]如何确定一个表已经被Populate 到In Memory 中?

    [Oralce][InMemory]如何确定一个表已经被Populate 到In Memory 中? 以如下方法来查看 POPULATE_STATUS 是不行的. SQL> select ins ...

  2. 重建索引解决mssql表查询超时的问题

    表已有数据,150万+,执行一个group by 的查询出现超时,一个一个条件减少尝试,前几个where条件不超时,而在加上最后一个条件时就超时了. 分析表的索引建立情况:DBCC showconti ...

  3. kill方法

    删除磁盘上的文件. 语法 Kill 路径名 所需的_路径名_参数是一个字符串表达式,指定要删除的一个或多个文件名. _Pathname_可能包括驱动器和目录或文件夹. 例子删除当前路径下的TXT文档 ...

  4. Jenkins自动构建Unity

    1.下载安装Jenkins 链接:https://jenkins.io/. 2.安装推荐plugins NOTE:安装失败的话,后面进入管理plugins的高级选项中,将更新站点设置为:http:// ...

  5. zabbix监控主机cpu达到80%后报警

    在zabbix监控中,默认cpu监控模板中的触发器,当负载在一定时间内(比如最近5分钟)超过5以上为报警阀值.但是在实际场景中,由于服务器配置不一样,这个默认的cpu触发器用起来意义就不大了,这时候就 ...

  6. 【个人博客作业II】代码复审结果

    [代码复审结果] General Does the code work? Does it perform its intended function, the logic is correct etc ...

  7. Linux内核分析-创建新进程的过程

    分析Linux内核创建一个新进程的过程 task_struct结构体分析 struct task_struct{ volatile long state; //进程的状态 unsigned long ...

  8. js异步回调

    简单理解:js是单线程的,Ajax请求远程数据.IO等会很耗时,引起堵塞可能会引起反应时间太长页面失去反应. 回调:A函数作为一个参数传给B函数,执行完B后再执行A: 同步回调: function A ...

  9. 【转】使用screw plus对PHP源码加密

    运行环境 ubuntu 14.04 php 5.6 源码地址 https://github.com/del-xiong/screw-plus http://git.oschina.net/splot/ ...

  10. Appium学习笔记3_Genymotion模拟器安装

    如果你已经配置好了安卓的运行环境,也配置好了自带的模拟器AVD,而且也launch了你的安卓模拟器,那么我相信你是不再愿意launch安卓模拟器第二次了,因为实在是太卡了(当然如果你电脑的配置够高,你 ...