BZOJ 4720 换教室

题目描述:

对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。在可以选择的课程中,有2n节
课程安排在n个时间段上。在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先
被安排在教室ci上课,而另一节课程在教室di进行。在不提交任何申请的情况下,学生们需要按时间段的顺序依次完
成所有的n节安排好的课程。如果学生想更换第i节课程的教室,则需要提出申请。若申请通过,学生就可以在第i个
时间段去教室di上课,否则仍然在教室ci上课。由于更换教室的需求太多,申请不一定能获得通过。通过计算,牛牛
发现申请更换第i节课程的教室时,申请被通过的概率是一个已知的实数ki,并且对于不同课程的申请,被通过的概率
是互相独立的。学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多m节课程进行申请。
这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申
请;牛牛可以申请自己最希望更换教室的m门课程,也可以不用完这m个申请的机会,甚至可以一门课程都不申请。因
为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从一间教室赶到另一间教室。牛牛所在
的大学有v个教室,有e条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,
通过不同的道路耗费的体力可能会有所不同。当第i(1≤i≤n-1)节课结束后,牛牛就会从这节课的教室出发,选择一
条耗费体力最少的路径前往下一节课的教室。现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体
力值的总和的期望值最小,请你帮他求出这个最小值。
 

Input

第一行四个整数n,m,v,e。n表示这个学期内的时间段的数量;m表示牛牛最多可以申请更换多少节课程的教室;
v表示牛牛学校里教室的数量;e表示牛牛的学校里道路的数量。
第二行n个正整数,第i(1≤i≤n)个正整数表示c,,即第i个时间段牛牛被安排上课的教室;保证1≤ci≤v。
第三行n个正整数,第i(1≤i≤n)个正整数表示di,即第i个时间段另一间上同样课程的教室;保证1≤di≤v。
第四行n个实数,第i(1≤i≤n)个实数表示ki,即牛牛申请在第i个时间段更换教室获得通过的概率。保证0≤ki≤1。
接下来e行,每行三个正整数aj,bj,wj,表示有一条双向道路连接教室aj,bj,通过这条道路需要耗费的体力值是Wj;
保证1≤aj,bj≤v,1≤wj≤100。
保证1≤n≤2000,0≤m≤2000,1≤v≤300,0≤e≤90000。
保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。
保证输入的实数最多包含3位小数。
 

Output

输出一行,包含一个实数,四舎五入精确到小数点后恰好2位,表示答案。你的
输出必须和标准输出完全一样才算正确。
测试数据保证四舎五入后的答案和准确答案的差的绝对值不大于4*10^-3。(如果你不知道什么是浮点误差,这段话
可以理解为:对于大多数的算法,你可以正常地使用浮点数类型而不用对它进行特殊的处理)
 

Sample Input

3 2 3 3
2 1 2
1 2 1
0.8 0.2 0.5
1 2 5
1 3 3
2 3 1

Sample Output

2.80
 
题目分析:这算是一道,期望dp的模板题吧(蒟蒻不是自己看出来的QAQ)
首先来想状态的定义...从数据范围来看n m都是2000,复杂度大概是nm,但是这样不好转移,加一维0/1
dp[i][j][0/1]表示,前i节课,共申请了j次,第i节课有没有申请,的最小期望距离
点数只有500,可以很容易的使用floyd算法预处理出多源最短路。考虑转移
dp[i][j][0]可以从dp[i - 1][j][0/1]转移过来,也就是前i - 1节课已经申请了j次,这是比较好转移的,代码如下
 dp[i][j][] = min(dp[i][j][],dp[i - ][j][] + dis[c[i - ]][c[i]]);
dp[i][j][] = min(dp[i][j][],dp[i - ][j][] + k[i - ] * dis[d[i - ]][c[i]] + ( - k[i - ]) * dis[c[i - ]][c[i]]);

dp[i][j][1]的转移就比较复杂了,分两种。

第一种,上一节课没有申请,那么转移只要从dp[i - 1][j - 1][0]转移过来就可以了,转移是只需要考虑这一次成不成功的期望

第二种,上一次也申请了,转移从dp[i - 1][j - 1][1]转移,但是估计期望距离的时候就比较麻烦了,上一次可以成功||不成功,这次也是,共有四种情况。

处理好细节~

 
 
CODES:
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define RI register int
using namespace std;
typedef long long ll; const int INF = 1e9 + ;
const int MAXN = + ; #define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b)) inline void read(int &x)
{
x = ;
bool flag = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') flag = ;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
x = x * + ch - '';
ch = getchar();
}
if(flag) x *= -;
} int n,m,v,e;
double dp[MAXN][MAXN][],k[MAXN],ans;
int dis[MAXN][MAXN],c[MAXN],d[MAXN],f,t,val; void init()
{
memset(dp,,sizeof(dp));
memset(dis,0x3f,sizeof(dis));
ans = dp[][][],dp[][][] = ,dp[][][] = ;
} void get()
{
read(n),read(m),read(v),read(e);
for(int i = ;i <= v;i ++) dis[i][i] = ;
for(int i = ;i <= n;i ++) read(c[i]);
for(int i = ;i <= n;i ++) read(d[i]);
for(int i = ;i <= n;i ++) scanf("%lf",&k[i]);
for(int i = ;i <= e;i ++)
{
read(f),read(t),read(val);
if(f == t) continue;
dis[f][t] = dis[t][f] = min(val,dis[f][t]);
}
} void floyd()
{
for(RI k = ;k <= v;k ++)
for(RI i = ;i <= v;i ++)
for(RI j = ;j <= v;j ++)
dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
} void DP()
{
for(RI i = ;i <= n;i ++)
{
dp[i][][] = dp[i - ][][] + dis[c[i - ]][c[i]];
for(RI j = ;j <= min(m,i);j ++)
{
dp[i][j][] = min(dp[i][j][],dp[i - ][j][] + dis[c[i - ]][c[i]]);
dp[i][j][] = min(dp[i][j][],dp[i - ][j][] + k[i - ] * dis[d[i - ]][c[i]] + ( - k[i - ]) * dis[c[i - ]][c[i]]);
dp[i][j][] = min(dp[i][j][],dp[i - ][j - ][] + k[i] * dis[c[i - ]][d[i]] + ( - k[i]) * dis[c[i - ]][c[i]]);
dp[i][j][] = min(dp[i][j][],dp[i - ][j - ][] +
k[i - ] * k[i] * dis[d[i - ]][d[i]] +
k[i - ] * ( - k[i]) * dis[d[i - ]][c[i]] +
( - k[i - ]) * k[i] * dis[c[i - ]][d[i]] +
( - k[i - ]) * ( - k[i]) * dis[c[i - ]][c[i]]);
if(i == n) ans = min(ans,dp[i][j][]),ans = min(ans,dp[i][j][]);
}
}
ans = min(ans,dp[n][][]);
printf("%.2lf\n",ans);
} int main()
{
init();
get();
floyd();
DP();
return ;
}

NOIP2016换教室 BZOJ 4720的更多相关文章

  1. BZOJ 4720 [Noip2016]换教室

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

  2. 【BZOJ】4720: [Noip2016]换教室

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

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

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

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

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

  5. [NOIP2016]换教室 题解(奇怪的三种状态)

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

  6. 【bzoj4720】[NOIP2016]换教室

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

  7. [NOIp2016] 换教室

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

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

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

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

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

随机推荐

  1. Commercial Lighting: LED Ceiling Light, LED Ceiling Light

    Unlike ceiling lamps, floor lamps, chandeliers, lamps that can sometimes rely on "faces", ...

  2. Makefile export

    1) 1.在(parent,上层的)makefile中export出来变量,子makefile(sub make)中,是可以访问的. 2. 而同一级别的makefile(可通过makefile中内置变 ...

  3. 如何通过源码包的方式在linux安装python36

    背景: python34的安装非常简单,直接用yum就可以安装,但是安装最新版的python36通过yum方式是不行的,需要通过源码包进行安装 具体步骤如下: 1.安装openssl静态库[pip3安 ...

  4. 利用Xshell5从本机上向Linux(虚拟机中)上传文件

    Xmanager Enterprise 5云盘分享:  http://pan.baidu.com/s/1jIkiQNW 1. 用ifconfig命令查看Linux的IP地址 2. 由于没有IP,所以我 ...

  5. 【代码总结】Struts2 拦截器的处理机制

    一.什么是拦截器 拦截器是一个类,可以在Action被调用之前和之后执行代码,通常框架的很多功能都是拦截器实现的,如接收输入的参数.数据验证.文件上传等 二.工作方式 做一些Action执行前的预处理 ...

  6. JSP技术(三)

    JSP指令 指令是JSP语法元素的第一种类型.它们指示JSP转换器如何翻译JSP页面为Servlet.JSP定义了多个指令,但只有page和include最重要.而taglib.tag.attribu ...

  7. pgspider http fdw http 相关的几个配置参数

    http 请求时间配置 session 级别的 set http.timeout_msec = 10000; SELECT http_set_curlopt('CURLOPT_TIMEOUT', '1 ...

  8. 微服务介绍和springCloud组件

      微服务架构模式是:将整个web服务 组织成一系列小的web 服务,这些小的web服务可以进行独立的编译和部署,并通过各自暴露的API接口 进行相互通信,他们相互协作,作为一个整体,为客户提供服务功 ...

  9. pwnable.kr-bof-Writeup

    MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  10. C语言笔记 10_文件读写&预处理器

    文件读写 上一章我们讲解了 C 语言处理的标准输入和输出设备.本章我们将介绍 C 程序员如何创建.打开.关闭文本文件或二进制文件. 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节.C ...