流下了不会概率的眼泪,由于不会概率,转移少写了点东西。。。

这个dp很简单,就是一个普通的线性dp加点期望。(刚开始写这道题时信笔写下)

\(dp[0/1][i][j]\)表示到第\(i\)个时间段时,已经申请了换\(j\)门课程的教室,当前申请0不换、1换教室的最小数学期望。

注意,我们的状态定义是申请,而不是已经申请成功,这样定义状态就可以统计出数学期望了。

对于当前状态没申请的情况,如果上一个时间段也没申请,那只有一种可能性发生,即俩状态都没换;如果上一个时间段申请了,那上一个状态就可能没成功,也可能成功了,二者我们都要统计。

对于申请了的情况也是一样的。

故有转移(巨长版)

\[dp[0][i][j]=min(dp[0][i-1][j]+dist(c_{i-1},c_{i}),\\dp[1][i-1][j]+k_{i-1}*dist(d_{i-1},c_i)+(1-k_{i-1})*dist(c_{i-1},c_i))\\~\\dp[1][i][j]=min(dp[0][i-1][j-1]+k_i*dist(c_{i-1},d_i)+(1-k_i)*dis(c_{i-1},c_i),\\dp[1][i-1][j-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))
\]

其中\(dist(x,y)\)表示最短路,观察数据范围,点数较少,直接上floyd。

初始化\(dp[0][1][0]=dp[1][1][1]=0,dp[0/1][][]=inf\)

答案在\(min(dp[0/1][n][0\sim m])\)。

注意重边和I\(inf\) 的设置,不要搞混\(n\)和\(v\)。

参考代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 310
#define M 2010
#define MOD 2520
#define E 1e-12
#define eps 4e-4
#define re register
using namespace std;
inline int read()
{
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n,m,v,e,c[M],d[M],dis[N][N];
double k[M],dp[2][M][M];
inline int Min(int a,int b){return a<b?a:b;}
inline double dmin(double a,double b){return a-b<eps?a:b;}//卡常(
inline void init()
{
for(re int k=1;k<=v;++k)
for(re int i=1;i<=v;++i)
for(re int j=1;j<=v;++j)
dis[i][j]=Min(dis[i][j],dis[i][k]+dis[k][j]);//floyd
for(re int i=1;i<=v;++i) dis[i][i]=dis[0][i]=dis[i][0]=0;//仔细观察,这也是dp边界的一部分
for(re int i=0;i<=n;++i)
for(re int j=0;j<=m;++j) dp[0][i][j]=dp[1][i][j]=INF*1.0;
}
int main()
{
n=read(),m=read(),v=read(),e=read();
memset(dis,0x3,sizeof(dis));
for(re int i=1;i<=n;++i) c[i]=read();
for(re int i=1;i<=n;++i) d[i]=read();
for(re int i=1;i<=n;++i) scanf("%lf",&k[i]);
for(re int i=1;i<=e;++i){
int u=read(),v=read(),w=read();
dis[u][v]=dis[v][u]=Min(dis[u][v],w);
}
init();
dp[0][1][0]=dp[1][1][1]=0;
for(re int i=2;i<=n;++i)
for(re int j=0;j<=Min(i,m);++j){
dp[0][i][j]=dmin(dp[0][i-1][j]+dis[c[i-1]][c[i]],dp[1][i-1][j]+k[i-1]*dis[d[i-1]][c[i]]+(1-k[i-1])*dis[c[i-1]][c[i]]);
if(j>=1) dp[1][i][j]=dmin(dp[0][i-1][j-1]+k[i]*dis[c[i-1]][d[i]]+(1-k[i])*dis[c[i-1]][c[i]],dp[1][i-1][j-1]+k[i]*k[i-1]*dis[d[i-1]][d[i]]+k[i]*(1-k[i-1])*dis[c[i-1]][d[i]]+(1-k[i])*k[i-1]*dis[d[i-1]][c[i]]+(1-k[i])*(1-k[i-1])*dis[c[i-1]][c[i]]);
}
double ans=INF*1.0;
for(re int i=0;i<=m;++i)
ans=dmin(ans,dmin(dp[0][n][i],dp[1][n][i]));
printf("%.2lf",ans);
return 0;
}

P1850 换教室[dp+期望]的更多相关文章

  1. Luogu P1850换教室【期望dp】By cellur925

    题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...

  2. 洛谷P1850 换教室 [noip2016] 期望dp

    正解:期望dp 解题报告: 哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星! 好那先把这题理顺了嗷qwq 首先我们看到期望就会 ...

  3. 【Luogu】P1850换教室(期望DP)

    题目链接 又一道面向题解编程的恶心神题.真是叫人质壁分离…… 设f[i][j][k]表示考虑了前i节课,尝试了j次,当前申请结果为k时消耗的体力值. 对于f[i][j][0]有两种情况:一是我们的主角 ...

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

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

  5. Luogu P1850 换教室(期望dp)

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

  6. P1850 换教室 期望dp

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

  7. bzoj4720 / P1850 换教室(Floyd+期望dp)

    P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...

  8. P1850 换教室

    P1850 换教室 现在有一张图, 有 \(v <= 300\) 个节点 你需要从 \(c_{1}\) 到 \(c_{2}\) 到 \(c_{n} (n <= 2000)\) 现在你有 \ ...

  9. 洛谷——P1850 换教室

    P1850 换教室 有 2n 节课程安排在 nn 个时间段上.在第 i个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 $c_i$​ 上课,而另一节课程在教室 $d_i$ ...

随机推荐

  1. Spring配置中<bean>的id和name属性

    在BeanFactory的配置中,<bean>是我们最常见的配置项,它有两个最常见的属性,即id和name,最近研究了一下,发现这两个属性还挺好玩的,特整理出来和大家一起分享. 1.id属 ...

  2. Python爬虫爬取BT之家找电影资源

    一.写在前面 最近看新闻说圣城家园(SCG)倒了,之前BT天堂倒了,暴风影音也不行了,可以说看个电影越来越费力,国内大厂如企鹅和爱奇艺最近也出现一些幺蛾子,虽然目前版权意识虽然越来越强,但是很多资源在 ...

  3. 用简单的JS代码制作计算器

    代码+注释一共不到200行,是练习交流的必备良药 主界面如下: 操作示意图: 以下是代码部分 HTML: <div> <table class="window"& ...

  4. 【数据结构与算法】k-d tree算法

    k-d tree算法 k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点 ...

  5. QuantLib 金融计算——收益率曲线之构建曲线(5)

    目录 QuantLib 金融计算--收益率曲线之构建曲线(5) 概述 Nelson-Siegel 模型家族的成员 Nelson-Siegel 模型 Svensson 模型 修正 Svensson 模型 ...

  6. Hyper-V虚拟机安装Ubuntu,启动的时候会出现:Please remove the installation medium,then press ENTER

    Hyper-V虚拟机安装Ubuntu成功以后,重启的时候页面会一直卡在下面,并报Please remove the installation medium,then press ENTER,这是因为启 ...

  7. Matlab匿名函数

    Matlab可以通过function去定义一些功能函数,这使得代码变得简洁和高效.但是如果遇到的是一些简单的数学公式组成的函数表达式,继续用function去定义函数,似乎显得有些冗杂和多余.这时候, ...

  8. os-enviroment

    pip3 install PyUserInput ping 是不带协议的

  9. ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

    软件的定时中断很难控制精准触发沿的位置,可以通过 PL-PS 的中断完成精准的定时中断.PL 的中断通过 Verilog 代码产生,这样紧密结合 PS-PL 的处理,发挥各自的优势. 一.PL 侧定时 ...

  10. 【题解】Luogu P5468 [NOI2019]回家路线

    原题传送门 前置芝士:斜率优化 不会的可以去杜神博客学 这道题我考场上只会拆点跑最短路的70pts做法 后来回家后发现错误的爆搜都能拿满分(刀片) 还有很多人\(O(mt)\)过的,还是要坚持写正解好 ...