LINK


思路

先floyed出两点最短路

然后就可以直接\(dp_{i,j,0/1}\)表示前i节课选择换j节,换不换当前这一节的最小贡献

直接可以枚举上一次决策的状态计算概率进行统计就可以了


我变量名写重了僵硬了半天。。。。被安排了


//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
//convenient for
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
const int N = 2010;
const int M = 310;
double g[M][M], p[N];
double dp[N][N][2];
int c[N], d[N];
int n, m, v, e;
int main() {
Read(n), Read(m), Read(v), Read(e);
fu(i, 1, n) Read(c[i]);
fu(i, 1, n) Read(d[i]);
fu(i, 1, n) scanf("%lf", &p[i]);
fu(i, 1, v)
fu(j, 1, v) g[i][j] = 1e8;
fu(i, 1, e) {
int x, y; double w;
Read(x), Read(y); scanf("%lf", &w);
g[x][y] = g[y][x] = min(w, g[x][y]);
}
fu(i, 1, v) g[i][i] = 0.0;
fu(k, 1, v)
fu(i, 1, v) if (i != k)
fu(j, 1, v) if (j != k)
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
double ans = 1e8;
fu(i, 1, n)
fu(j, 0, m) dp[i][j][0] = dp[i][j][1] = 1e8;
dp[1][0][0] = dp[1][1][1] = 0;
fu(i, 2, n) {
fu(j, 0, m) {
dp[i][j][0] = min(dp[i - 1][j][1] + p[i - 1] * g[d[i - 1]][c[i]] + (1.0 - p[i - 1]) * g[c[i - 1]][c[i]], dp[i - 1][j][0] + g[c[i - 1]][c[i]]);
if (j) dp[i][j][1] = min(dp[i - 1][j - 1][1] + p[i - 1] * p[i] * g[d[i - 1]][d[i]] + (1.0 - p[i - 1]) * p[i] * g[c[i - 1]][d[i]] + p[i - 1] * (1.0 - p[i]) * g[d[i - 1]][c[i]] + (1.0 - p[i - 1]) * (1.0 - p[i]) * g[c[i - 1]][c[i]], dp[i - 1][j - 1][0] + (p[i] * g[c[i - 1]][d[i]] + (1.0 - p[i]) * g[c[i - 1]][c[i]]));
}
}
fu(i, 0, m) ans = min(ans, min(dp[n][i][0], dp[n][i][1]));
printf("%.2lf", ans);
return 0;
}

LOJ2360. 「NOIP2016」换教室【概率DP】【Floyed】【傻逼题】的更多相关文章

  1. [LOJ] #2360. 「NOIP2016」换教室

    期望DP #include<iostream> #include<cstring> #include<cstdio> #include<cctype> ...

  2. 「NOIP2016」换教室

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

  3. 「NOIP2016」「P1850」 换教室(期望dp

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

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

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

  5. P1850 换教室 概率dp

    其实说是概率dp,本质上和dp没什么区别,就是把所有可能转移的情况全枚举一下就行了,不过dp方程确实有点长... ps:这个题的floyed我竟然之前写跪了... 题目: 题目描述 对于刚上大学的牛牛 ...

  6. 【NOIP2016】换教室(DP,期望)

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

  7. luogu 1850 换教室 概率+dp

    非常好的dp,继续加油练习dp啊 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) ...

  8. LOJ2537. 「PKUWC2018」Minimax【概率DP+线段树合并】

    LINK 思路 首先暴力\(n^2\)是很好想的,就是把当前节点概率按照权值大小做前缀和和后缀和然后对于每一个值直接在另一个子树里面算出贡献和就可以了,注意乘上选最大的概率是小于当前权值的部分,选最小 ...

  9. 换教室(期望+DP)

    换教室(期望+DP) \(dp(i,j,1/0)\)表示第\(i\)节课,申请了\(j\)次调换,这节课\(1/0\)调换. 换教室 转移的时候考虑: 上次没申请 这次也没申请 加上\(dis(fr[ ...

随机推荐

  1. Learning Perl 第九章习题第二题

    把输入文件中的所有Fred换成Larry, 不区分大小写. 知识点 1. 文本文件读写 2. 简单的正则替换 3. unless 的用法 4. $_ 的用法

  2. MySQL行锁、间隙锁、Next-Key锁

    InnoDB是一个支持行锁的存储引擎,它有三种行锁的算法: Record Lock:行锁,单个行记录上的锁. Gap Lock:间隙锁,锁定一个范围,但不包括记录本身.GAP锁的目的,是为了防止幻读. ...

  3. python3安装tensorflow遇到的问题

    1. 使用命令:sudo pip3 install --upgrade \ https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow ...

  4. Python编程

    1.pip的使用.安装 pip show 显示输出版本 pip -V 是否安装成功 pip --help 查看相关帮助

  5. MVC后台的几种跳转方法

    //当服务器执行到Response.Redirect语句时,会立即中断页面的生命周期,直接向客户端返回信息,让客户端进行重定向操作.302(暂时重定向) Response.Redirect(" ...

  6. hdu2121无定根的最小树形图

    无定根的最小树形图,像网络流的超级源和超级汇一样加一个起点,用邻接表(n>1000) n<1000用邻接矩阵 #include<map> #include<set> ...

  7. SpringBoot下的值注入

    在我们实际开发项目中,经常会遇到一些常量的配置,比如url,暂时不会改变的字段参数,这个时候我们最好是不要直接写死在代码里的,因为这样编写的程序,应用扩展性太差了,我们可以直接写在配置文件中然后通过配 ...

  8. mysql too many connections解决方法

    MySQL提示“too many connections”的解决办法   今天生产服务器上的MySQL出现了一个不算太陌生的错误“Too many connections”.平常碰到这个问题,我基本上 ...

  9. UVA-1623 Enter The Dragon (贪心)

    题目大意:有n个装满水的湖,m天.每天可能下雨也可能晴天,只要下雨就会把湖填满,若已满,则发洪水.有一台只能在晴天使用的抽水机,每次抽水只能抽一个湖,并且全部抽光.问是否存在一种使得不发洪水的抽水方案 ...

  10. nyoj1015——二分图染色

    二部图 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 二部图又叫二分图,我们不是求它的二分图最大匹配,也不是完美匹配,也不是多重匹配,而是证明一个图是不是二部图.证 ...