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. 用户 'IIS APPPOOL\Private' 登录失败。

    用户 'IIS APPPOOL\Private' 登录失败. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细 ...

  2. 数据分析基础之Linalg的使用

    Linear algebra 简介 When SciPy is built using the optimized ATLAS LAPACK and BLAS libraries, it has ve ...

  3. jQuery点击下拉菜单的展示与隐藏

    首先点击显示某个div,然后要求再次点击时消失,或者点击document的其他地方会隐藏掉这个层,涉及到冒泡的问题,阻止document冒泡到dom上.代码如下: var $el = $(" ...

  4. lynx---CentOS终端访问IP

    1.官网 http://lynx.isc.org 2.稳定版本 http://invisible-mirror.net/archives/lynx/tarballs/lynx2.8.8rel.2.ta ...

  5. JavaSE高级1

    内部类 内部类概念: 所谓内部类(Inner Class),顾名思义,就是将一个类定义在另一个类的内部.内部的类称之为内部类. 内部类的主要特点: 内部类可以很好的实现隐藏,可以使用protected ...

  6. (11.13)Java小知识!

    今天想要与大家分享一下有关于构造方法的知识! 构造方法的定义与作用 构造方法是一种特殊类型的方法.当一个对象被创建的时候,构造方法用来初始化对象,也就是说构造方法其实是一个名词而不是动词,像我刚刚开始 ...

  7. PLSQL锁表之后改如何操作

    (1)查看哪个表被锁select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects ...

  8. Java实现TFIDF算法

    算法介绍 最近要做领域概念的提取,TFIDF作为一个很经典的算法可以作为其中的一步处理. 关于TFIDF算法的介绍可以参考这篇博客http://www.ruanyifeng.com/blog/2013 ...

  9. C#的Main(String[] args)参数输入问题

    1.新建一个控制台应用程序,保存在桌面上,Main函数如下所示 using System;using System.Collections.Generic;using System.Linq;usin ...

  10. [转载] linux中文件描述符fd和文件指针flip的理解

    转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...