https://www.luogu.org/problem/show?pid=1850

题面很长,实质很水的一道期望DP题。题面自带劝退效果。

首先用Floyd算出任意两点的最短路径。然后设f(i,j,0)为前i节课申请更换j节,且不申请第i节时的最小期望;设f(i,j,1)前i节课申请更换j节,且申请第i节时的最小期望。
可得下面这个超长的状转方程:
f(i,j,0)=min{
  f(i-1,j,0) + dist(c[i-1],c[i]),    // 不申请第i-1节
  f(i-1,j,1) + k[i-1]*dist(d[i-1],c[i]) + (1-k[i-1])*dist(c[i-1],c[i])    // 申请第i-1节
}
f(i,j,1)=min{
  f(i-1,j-1,0) + k[i]*dist(c[i-1],d[i]) + (1-k[i])*dist(c[i-1],c[i]),    // 不申请第i-1节
  f(i-1,j-1,1) + k[i-1]*k[i]*dist(d[i-1],d[i]) + (1-k[i-1])*k[i]*dist(c[i-1],d[i]) + k[i-1]*(1-k[i])*dist(d[i-1],c[i]) + (1-k[i-1])*(1-k[i])*dist(c[i-1],c[i])    // 申请第i-1节
}
注意f(i,0,0)意味着一节课都不申请,需要特判f(i,0,0)=f(i-1,0,0)+dist(c[i-1],c[i])

#include <cstdio>
#include <algorithm>
#define maxv 310
#define maxn 2010
using namespace std;
const int inf = ;
int v, e; // v表示牛牛学校里教室的数量;e表示牛牛的学校里道路的数量
int dist[maxv][maxv];
void add_edge(int from, int to, int weight)
{
dist[from][to] = min(dist[from][to], weight); //注意重边和自环
dist[to][from] = dist[from][to];
}
void floyd()
{
// d(k,i,j)=min{d(k-1,i,j), d(k-1,i,k)+d(k-1,k,j)}
for (int k = ; k <= v; k++)
for (int i = ; i <= v; i++)
for (int j = ; j <= v; j++)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
int n, m; // n表示这个学期内的时间段的数量;m表示牛牛最多可以申请更换多少节课程的教室
int c[maxn]; // 第i个时间段牛牛被安排上课的教室
int d[maxn]; // 第i个时间段另一间上同样课程的教室
double k[maxn]; // 牛牛申请在第i个时间段更换教室获得通过的概率
void load()
{
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]); for (int i = ; i <= v; i++) //初始化邻接矩阵
{
for (int j = ; j <= v; j++)
dist[i][j] = inf;
dist[i][i] = ;
} int tmp1, tmp2, tmp3;
for (int i = ; i <= e; i++)
{
scanf("%d%d%d", &tmp1, &tmp2, &tmp3);
add_edge(tmp1, tmp2, tmp3);
}
}
double dp[maxn][maxn][];
int main()
{
load();
floyd();
for (int i = ; i <= n; i++)
{
dp[i][][] = dp[i - ][][] + dist[c[i - ]][c[i]]; // f(i,0,0)意味着一节课都不申请,需要特判
dp[i][][] = ;
for (int j = ; j <= m; j++)
{
// 第1~i节课,申请更换j节,且不申请第i节时的最小期望
dp[i][j][] = min(
dp[i - ][j][] + dist[c[i - ]][c[i]], // 不申请第i-1节
dp[i - ][j][] + k[i - ] * dist[d[i - ]][c[i]] + ( - k[i - ]) * dist[c[i - ]][c[i]] // 申请第i-1节
); // 第1~i节课,申请更换j节,且申请第i节时的最小期望
dp[i][j][] = min(
dp[i - ][j - ][] + k[i] * dist[c[i - ]][d[i]] + ( - k[i]) * dist[c[i - ]][c[i]], // 不申请第i-1节
dp[i - ][j - ][] + k[i - ] * k[i] * dist[d[i - ]][d[i]] + ( - k[i - ]) * k[i] * dist[c[i - ]][d[i]] + k[i - ] * ( - k[i]) * dist[d[i - ]][c[i]] + ( - k[i - ]) * ( - k[i]) * dist[c[i - ]][c[i]] // 申请第i-1节
);
}
}
printf("%.2f", min(dp[n][m][], dp[n][m][]));
return ;
}

【NOIP2016提高组】换教室的更多相关文章

  1. [NOIp2016提高组]换教室

    题目大意: 有n节课,第i节课在c[i]上课,同时d[i]也有一节课d[i]. 你有权利向教务处发出m次申请把自己的教室改到d[i],相应的批准概率是k[i]. 教室是图上的一些点,其中每条边都有边权 ...

  2. Luogu P1850 [NOIp2016提高组]换教室 | 期望dp

    题目链接 思路: <1>概率与期望期望=情况①的值*情况①的概率+情况②的值*情况②的概率+--+情况n的值*情况n的概率举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地 ...

  3. 洛谷 1850 NOIP2016提高组 换教室

    [题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...

  4. 题解 P1850 [NOIP2016 提高组] 换教室

    做完这道题才略微感觉自己懂了一点关于概率与期望的知识QAQ... 一:关于概率与期望的定义 转载节选于blog 1.什么是数学期望? 数学期望亦称期望.期望值等.在概率论和统计学中,一个离散型随机变量 ...

  5. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  6. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  7. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  8. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  9. noip2016 提高组

    T1 玩具谜题 题目传送门 这道题直接模拟就好了哇 233 #include<cstdio> #include<cstring> #include<algorithm&g ...

  10. NOIP2016 DAY1 T3 换教室

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

随机推荐

  1. struts2(二)之配置文件详解与结果视图

    前言 前面介绍了struts2的一个程序的大概流程,还有它的配置文件. 一.struts.xml文件元素详解 1.1.package元素 1)作用 在struts2的配置文件中引入了面向对象思想,使用 ...

  2. Ionic3 创建应用(Android)

    打开CMD 通过命令行进入项目目录 创建一个App项目 ionic start myApp blank 空白App ionic start myApp tabs 导航条 ionic start myA ...

  3. Max Sum Plus Plus

    A - Max Sum Plus Plus Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  4. Java面试题-2

    程序员面试之九阴真经 谈谈final, finally, finalize的区别: final:::修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此 ...

  5. 机器学习之Logistic 回归算法

    1 Logistic 回归算法的原理 1.1 需要的数学基础 我在看机器学习实战时对其中的代码非常费解,说好的利用偏导数求最值怎么代码中没有体现啊,就一个简单的式子:θ= θ - α Σ [( hθ( ...

  6. 【OpenCV】一种基于阈值的图片中的文字分割

    在今年泰迪杯A题电商中图片的文字识别这道题中,我们先用了一种很笨的办法来分割字符. 首先对图片进行灰度化,然后二值化,这里的二值化要选择一个合适的阈值.然后我们进行轮廓的提取,计算轮廓最小矩形的面积, ...

  7. CentOS配置上网

    CentOS设置:   进入CentOS命令模式: Centos7更改默认启动桌面(或命令行)模式 vi /etc/inittab:查看启动文件,在该文件中存在两种方式: multi-user.tar ...

  8. 基于Visual Studio 2010 阐述C#4个特性

    Csharp4.0与以往版本基础体现了强大的性能优势,主要体现在以下四个方面: 1. 通过委托成员来实现接口 在C# 4.0中可以通过委托来实现某个成员的接口,例如下面的代码: public clas ...

  9. 采用Vue2.0开发的分页js组件

    2017-11-17 19:14:23 基于jQuery的分页插件相信大家伙已经都用过很多了,今天分享一下基于Vue2.0的分页插件pagination.js 由于项目需求,要求使用 Vue2.0 开 ...

  10. javascript获取年月日

    javascript获取年月日代码片段 function getNowDate() { var date = new Date(); var split = "-"; var ye ...