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. dfs序和欧拉序

    生命不息,学习不止,昨天学了两个算法,总结一下,然而只是略懂,请路过的大佬多多谅解.   一.dfs序 1.什么是dfs序? 其实完全可以从字面意义上理解,dfs序就是指一棵树被dfs时所经过的节点的 ...

  2. Problem E

    题意:看电视,计算出最多看多少个电视,已给出电视起始终止时间: 解体思路:思路这个题拿到手没多想,上课的例题,就照葫芦画瓢写了一个: 感悟:虽然刚开始学贪心,第一遍代码就AC了有点小小的成就感: 代码 ...

  3. The Suspects(并查集维护根节点信息)

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 37090   Accepted: 17980 De ...

  4. Intelligence System

    Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  5. 【Aladdin Unity3D Shader编程】之三 光照模型(二)

    高光反射模型 Specular=直射光*pow(cosθ,高光的参数) θ:是反射光和视野方向的夹角 编写高光反射Shader Shader "AladdinShader/07 Specul ...

  6. AngularJS学习篇(二)

    AngularJS 指令 AngularJS 通过被称为 指令 的新属性来扩展 HTML. AngularJS 通过内置的指令来为应用添加功能. AngularJS 允许你自定义指令. Angular ...

  7. media query 单位

    使用em 判断的media query 在用户缩放的时候不会被破坏,使用em更加合适内容为王的页面趋势   内容的容器需要根据内容而按比例设置,就像line-height:1.14em,文字大小的1. ...

  8. .net中LAMBDA表达式常用写法

    这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下: 1.select语句:books.Select ...

  9. Eclipse中启动tomcat从console跳回servers

  10. [转载] Kafka+Storm+HDFS整合实践

    转载自http://www.tuicool.com/articles/NzyqAn 在基于Hadoop平台的很多应用场景中,我们需要对数据进行离线和实时分析,离线分析可以很容易地借助于Hive来实现统 ...