题目很长,是一道概率dp题,一般需要逆推,但这题结局不确定所以要顺推。

用f[i][j][k],i表示第i段时间,j表示用了j次申请,k就表示这轮是否用申请。

那么要求min(f[n][0~m][0],f[n][0~m][1])

状态转移方程有点麻烦,需要细心。

①前一个不需要申请,当前的时间也不需要申请。这个最容易推出来f[i][j][0]=min(f[i][j][0],(f[i-1][j][0]+dis[c[i-1]][c[i]]))×1.0)

②当前j>=1,那么至少可以申请一次。也就是可以前一个时间没申请,当前申请。或者前一个时间申请,当前没申请。

③当前j>=2,那么就可以考虑前一段时间也申请了。因为申请分成功和失败,所以这里有4个不同的状况要考虑。分别是:

申请成功->申请成功

申请成功->申请失败

申请失败->申请成功

申请失败->申请失败

代码中的_11s表示前一段时间申请了,这一次也申请了,并申请成功。1表示申请了,0表示没申请。s表示成功,f表示失败。

代码如下:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long ll; int n,m,v,e;
int c[],d[];
double k[];
int dis[][],a,b,cc;
double f[][][];
int main(){
scanf("%d%d%d%d",&n,&m,&v,&e);
for(int i=;i<=n;++i)scanf("%d",&c[i]);
for(int i=;i<=n;++i)scanf("%d",&d[i]);
for(int i=;i<=n;++i)scanf("%lf",&k[i]);
memset(dis,0x3f,sizeof dis);
for(int i=;i<=v;++i)dis[i][i]=;
for(int i=;i<=e;++i){
scanf("%d%d%d",&a,&b,&cc);
dis[a][b]=dis[b][a]=min(dis[a][b],cc);
}
for(int kk=;kk<=v;++kk)
for(int i=;i<=v;++i)
for(int j=;j<=v;++j)
dis[i][j]=dis[j][i]=min(dis[i][j],dis[i][kk]+dis[kk][j]);
for(int i=;i<=n;++i)for(int j=;j<=m;++j)
f[i][j][]=f[i][j][]=0x3f3f3f3f;
f[][][]=f[][][]=0.0;
for(int i=;i<=n;++i){
for(int j=;j<=min(i,m);++j){
f[i][j][]=min(f[i][j][],f[i-][j][]+dis[c[i-]][c[i]]);
if(j>=){
double _10s=(f[i-][j][]+1.0*dis[d[i-]][c[i]])*k[i-];
double _10f=(f[i-][j][]+1.0*dis[c[i-]][c[i]])*(1.0-k[i-]);
f[i][j][]=min(f[i][j][],_10s+_10f);
double _01s=(f[i-][j-][]+1.0*dis[c[i-]][d[i]])*k[i];
double _01f=(f[i-][j-][]+1.0*dis[c[i-]][c[i]])*(1.0-k[i]);
f[i][j][]=min(f[i][j][],_01s+_01f);
}
if(j>=){
double _11ss,_11ff,_11sf,_11fs;
_11ss=(f[i-][j-][]+dis[d[i-]][d[i]])*k[i-]*k[i];
_11ff=(f[i-][j-][]+1.0*dis[c[i-]][c[i]])*(1.0-k[i-])*(1.0-k[i]);
_11fs=(f[i-][j-][]+1.0*dis[c[i-]][d[i]])*(1.0-k[i-])*k[i];
_11sf=(f[i-][j-][]+1.0*dis[d[i-]][c[i]])*k[i-]*(1.0-k[i]);
double tmp=_11ss+_11ff+_11sf+_11fs;
f[i][j][]=min(f[i][j][],tmp);
}
}
}
double ans=0x3f3f3f3f;
for(int i=;i<=m;++i)
ans=min(ans,min(f[n][i][],f[n][i][]));
printf("%.2lf\n",ans);
return ;
}

BZOJ4720-换教室的更多相关文章

  1. 【bzoj4720】[NOIP2016]换教室

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

  2. bzoj4720 / P1850 换教室(Floyd+期望dp)

    P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...

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

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

  4. 【BZOJ4720】【NOIP2016】换教室 [期望DP]

    换教室 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Input 第一行四个整数n,m,v ...

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

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

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

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

  7. [BZOJ 4720][NOIP 2016] 换教室

    记得某dalao立了"联赛要是考概率期望我直播吃键盘"的$flag$然后就有了这道题233333 4720: [Noip2016]换教室 Time Limit: 20 Sec  M ...

  8. [NOIp2016] 换教室

    题目类型:期望\(DP\) 传送门:>Here< 题意:现有\(N\)个时间段,每个时间段上一节课.如果不申请换教室,那么时间段\(i\)必须去教室\(c[i]\)上课,如果申请换课成功, ...

  9. luoguP1850 换教室

    luoguP1850 换教室 链接 https://www.luogu.org/problemnew/show/P1850 思路 状态很显然就是f[n][k][0/1] 前i次,用了k次机会,当前是在 ...

  10. BZOJ 4720 [Noip2016]换教室

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

随机推荐

  1. word交叉引用公式编号时和连公式一起引用

    如下所示: 假定一副待处理图像中的灰度值个数为m,灰度值为i的像素个数为 个,那么图像中的总像素数为N,公式如m=x+y (2)所示: m=x+y                            ...

  2. haproxy监控页面添加及参数简介(转)

    环境: [root@localhost 13:55:31 haproxy]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@loca ...

  3. 配置ESP8266 NONOS SDK时由于工具链版本差异引发的故障

    前几天部署ESP8266_NONOS_SDK时遇到了一个看似奇怪的问题,描述如下: examples例程可以通过编译,但烧写到ESP8266模块后,程序无法正常运行,编译和烧写的相关配置均无误.在bo ...

  4. ExpandableListView解析JSON数据

    效果图:                                       说明:刚开始使用这个控件我花费了3天的时间,但是一直都没有达到预期的效果,要么就是直接全部不显示,要么就是数据累加 ...

  5. Centos 7 配置邮件发送

    一.环境 系统:centos 7 sendmail:sendmail.x86_64 0:8.14.7-5.el7 mailx版本:mailx-12.5-19.el7.x86_64 二.软件安装: 1. ...

  6. python note 12 生成器、推导式

    1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...

  7. 洛谷 P1426小鱼会有危险吗

    题目: 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是探 ...

  8. spring微服务架构-脑图

    spring团队对新一代软件开发的思索.为什么软件开发是spring boot?为什么软件开发是spring cloud?如何使用spring cloud搭建微服务. 清晰脑图查看

  9. Java-HashMap、HashSet、hashTable

    HashMap:key:可null,重复的key对应的value会出现后面覆盖前面的情况.value:可null; 引用:数组,数组中存链表. HashSet使用HashMap的实现存储数据,所以有H ...

  10. sql server版本、组件和管理工具

    以下信息由何问起收集,希望有帮助. SQL Server 版本 定义 Enterprise 作为高级版本, SQL Server Enterprise 版提供了全面的高端数据中心功能,性能极为快捷.虚 ...