哇好开心啊!写的时候真的全然对于这个加法没有把握,但还是大着胆子试着写了一下——竟然过了样例?于是又调了一下就过啦。

不过想想也觉得是正确的吧,互相独立的事件对于期望的影响自然也是相互独立的,可以把所有的情况看成一个整体,不同的统计方式只是分组的区别,最后算出来的答案肯定是一样的。dp的状态比较显然:dp[i][j][0/1]代表当前在第i节课,已经用去了j次申请的机会,0/1分别代表当前这一节课是否申请。那么这个时候就分情况讨论,计算这一次的选择对于答案的影响。

这些不同的情况分别是:当前和上一次是否选择申请换课,申请换课的是否成功。

期望的计算式:成功的概率*成功的代价+失败的概率*失败的代价。

#include <bits/stdc++.h>
using namespace std;
#define maxn 2050
#define INF 1047483640
#define maxm 2050
#define maxv 400
int n, m, v, e, dis[maxv][maxv], c[maxn], d[maxn];
double ans = , dp[maxn][maxm][], k[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void init()
{
for(int i = ; i <= v; i ++)
for(int j = i + ; j <= v; j ++)
dis[i][j] = dis[j][i] = INF; for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
dp[i][j][] = dp[i][j][] = INF;
} double gmin(double &x, double y)
{
x = (x < y) ? x : y;
} int gmin2(int &x, int y)
{
x = (x < y) ? x : y;
} void Floyd()
{
for(int k = ; k <= v; k ++)
for(int i = ; i <= v; i ++)
for(int j = ; j <= v; j ++)
gmin2(dis[i][j], dis[i][k] + dis[k][j]);
} int main()
{
n = read(), m = read(), v= read(), e = read();
for(int i = ; i <= n; i ++) c[i] = read();
for(int i = ; i <= n; i ++) d[i] = read();
init();
dp[][][] = dp[][][] = ;
for(int i = ; i <= n; i ++) scanf("%lf", &k[i]);
for(int i = ; i <= e; i ++)
{
int x = read(), y = read(), z = read();
dis[x][y] = dis[y][x] = min(dis[y][x], z);
}
for(int i = ; i <= v; i ++) dis[i][i] = ;
Floyd();
for(int i = ; i <= v; i ++)
dis[i][] = dis[][i] = ;
c[] = d[] = , k[] = ;
for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
{
gmin(dp[i][j][], dp[i - ][j][] + dis[c[i]][c[i - ]]);
gmin(dp[i][j][], dp[i - ][j][] + dis[c[i]][c[i - ]] * ( - k[i - ]) + dis[c[i]][d[i - ]] * k[i - ]);
if(j) gmin(dp[i][j][], dp[i - ][j - ][] + dis[c[i]][c[i - ]] * ( - k[i]) + dis[d[i]][c[i - ]] * k[i]);
double tem = ;
tem += dis[c[i]][c[i - ]] * ( - k[i]) * ( - k[i - ]);
tem += dis[c[i]][d[i - ]] * ( - k[i]) * k[i - ];
tem += dis[d[i]][c[i - ]] * k[i] * ( - k[i - ]);
tem += dis[d[i]][d[i - ]] * k[i] * k[i - ];
if(j) gmin(dp[i][j][], dp[i - ][j - ][] + tem);
}
for(int i = ; i <= m; i ++)
gmin(ans, min(dp[n][i][], dp[n][i][]));
printf("%.2lf", ans);
return ;
}

【题解】NOIP2016换教室的更多相关文章

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

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

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

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

  3. BZOJ 4720 [Noip2016]换教室

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

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

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

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

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

  6. 【bzoj4720】[NOIP2016]换教室

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

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

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

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

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

  9. [NOIp2016] 换教室

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

  10. NOIP2016换教室 BZOJ 4720

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

随机推荐

  1. Lavavel5.5源代码 - Pipeline

    <?php class Pipeline { protected $passable; protected $pipes = []; protected $method = 'handle'; ...

  2. mysql帐号不允许从远程登陆

    默认情况下,mysql帐号不允许从远程登陆,只能在localhost登录.本文提供了二种方法设置mysql可以通过远程主机进行连接. 一.改表法 在localhost登入mysql后,更改 “mysq ...

  3. 安装java 和 eclipse

    昨天安装eclipse出现个问题, 安装完了创建第一个项目目录的时候弹窗报错an ......什么什么, 百度一堆没有用,后来发现是jdk12不支持,换了jdk8就可以了, 然后eclipse安装py ...

  4. pycharm中每次创建py文件时就自动生成代码头,以及出现SyntaxError:Non-ASCII 。。。问题

    我们在pycharm中执行py文件的时候,可能会出现以下错误 这是因为你没有制定编码格式,这时候你需要在文件最开始制定编码格式,代码如下 #!/user/bin/env python #-*- cod ...

  5. Python3爬虫(九) 数据存储之关系型数据库MySQL

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 关系型数据库关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以关系型数据库的存储方式就是行列 ...

  6. CERC2017 Gambling Guide,最短路变形,期望dp

    题意 给定一个无向图,你需要从1点出发到达n点,你在每一点的时候,使用1个单位的代价,随机得到相邻点的票,但是你可以选择留在原地,也可以选择使用掉这张票,问到达n点的最小代价的方案的期望是多少. 分析 ...

  7. Eclipse_安装SAP_HANA数据库插件

    1.对于Eclipse Oxygen,请添加URL https://tools.hana.ondemand.com/oxygen 2.对于Eclipse luna,请添加URL     https:/ ...

  8. linux进程 生产者消费者

    #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h> # ...

  9. 虚拟接VMnet1 和VMnet8的区别

    vmnet1是host-only,也就是说,选择用vmnet1的话就相当于VMware给你提供了一个虚拟交换机,仅将虚拟机和真实系统连上了,虚拟机可以与真实系统相互共享文件,但是虚拟机无法访问外部互联 ...

  10. 数据库学习(二) case when then else end 的使用

    case函数还用来统计数据的,参考资料:https://www.cnblogs.com/qlqwjy/p/7476533.html 这里我只是整理下工作中使用的到案例: 查询语句: SELECT t. ...