首先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. CF [2016-2017 ACM-ICPC CHINA-Final][GYM 101194 H] Great Cells

    很久以前做的一道思博题了,今天来补一补. 大致题意:在一个\(n*m\)的矩阵内填整数,数字在\([1,k]\)范围内.矩阵中某格的数为great number当且仅当与它同行同列的数字都严格比它小. ...

  2. 【变态需求】bootstrapTable列排序-选择正序倒序不排序

    产品经理:那个table排序能不能点击后弹个选项选择正序倒序不排序? -- 那个是bootstrapTable的插件!不支持!改不了!! 注意:数据上假的,效果看http请求参数进行脑补 这是boot ...

  3. 记一次用WPScan辅助渗透WordPress站点

    记一次用WPScan辅助渗透WordPress站点 一.什么是WPScan? WPScan 是一个扫描 WordPress 漏洞的黑盒子扫描器,它可以为所有 Web 开发人员扫描 WordPress ...

  4. 分布式监控系统Zabbix-完整安装记录 -添加端口监控

    对于进程和端口的监控,可以使用zabbix自带的key进行监控,只需要在server端维护就可以了,相比于nagios使用插件去监控的方式更为简单.下面简单介绍配置:监控端口zabbix监控端口使用如 ...

  5. C. Party Lemonade

    链接 [http://codeforces.com/group/1EzrFFyOc0/contest/913/problem/C] 分析 看代码,巧妙的贪心 代码 #include<bits/s ...

  6. Daily Scrumming* 2015.12.19(Day 11)

    一.团队scrum meeting照片 二.成员工作总结 姓名 任务ID 迁入记录 江昊 任务1090 https://github.com/buaaclubs-team/temp-front/com ...

  7. Java实验二

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1351    姓名:黄君如  学号:20135117 成绩:             指导教师:娄 ...

  8. 【读书笔记】Linux内核设计与实现(第三章)

    3.1 进程 处于执行期的程序. 进程就是正在执行的程序代码的实时结果.内核需要有效而又透明地管理所有细节. 执行线程(简称线程):在进程中活动的对象.每个线程都拥有一个独立的程序计数器.进程栈和一组 ...

  9. Practice3 阅读《构建之法》1-5章

    第一章:概论 本章主要是讲了软件工程的基本概念,软件工程的最终目标是创造“足够好”的软件. 提出问题:什么是BUG?(出自1.2.5节) 答:就我个人而言,在许多游戏中也有许多的BUG,BUG这一词在 ...

  10. Java用JSoup组件提取asp.net webform开发网页的viewstate相关相关参数

    /** * 从页面中提取特定input的的Value * @param formparams * @param document * @param elementId */ private void ...