Description

题目链接:Luogu

Solution

这题结合了DP和概率与期望,其实只要稍微知道什么是期望就可以了,

状态的构造很关键,\(F[i][j][0/1]\)表示已经到第\(i\)个课程,之前用了\(j\)个申请机会,且当前课程是(1)否(0)申请

然后就容易想到转移方程,

\(F_{i,j,0}=min\{F_{i-1,j,0}+dis(c_{i-1},c_i),F_{i-1,j,1}+dis(c_{i-1},c_i)*(1-p_{i-1})+dis(d_{i-1},c_i)*p_{i-1}\}\)

\[F_{i,j,1}=min\{F_{i-1,j-1,0}+dis(c_{i-1},c_i)*(1-p_i)+dis(c_{i-1},d_i)*p_i,
F_{i-1,j-1,1}+dis(c_{i-1},c_i)*(1-p_{i-1})*(1-p_i)+dis(d_{i-1},d_i)*p_{i-1}*p_i+
dis(c_{i-1},d_i)*(1-p_{i-1})*p_i+dis(d_{i-1},c_i)*p_{i-1}*(1-p_i) \}
\]

方程看起来复杂但仔细分析会会发现其实很裸

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define db double
#define N 2010
using namespace std; int n,m,V,E,c[N],d[N],g[320][320];
db p[N],f[N][N][2],Ans; inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch = getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch = getchar();}
return x*f;
} inline void Init(){
n=read(),m=read(),V=read(),E=read();
for(int i=1;i<=n;++i) c[i]=read();
for(int i=1;i<=n;++i) d[i]=read();
for(int i=1;i<=n;++i) scanf("%lf",&p[i]);
memset(g,127/2,sizeof(g));
for(int i=1;i<=E;++i){
int u=read(),v=read(),w=read();
g[u][v]=min(g[u][v],w);
g[v][u]=g[u][v];
}
for(int k=1;k<=V;++k)
for(int i=1;i<=V;++i)
for(int j=1;j<=V;++j)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
for(int i=1;i<=V;++i) g[i][i]=0;
} int main() {
Init();
for(int i=1;i<=n;++i)for(int j=0;j<=m;++j)f[i][j][0]=f[i][j][1]=1e9;
f[1][0][0]=f[1][1][1]=0; for(int i=2;i<=n;++i){
int lim=max(i,m);
for(int j=0;j<=lim;++j){
f[i][j][0]=min(f[i-1][j][0]+g[c[i-1]][c[i]],f[i-1][j][1]+g[c[i-1]][c[i]]*(1.0-p[i-1])+g[d[i-1]][c[i]]*p[i-1]);
if(j<1) continue; db tmp=f[i-1][j-1][1]+g[c[i-1]][c[i]]*(1.0-p[i-1])*(1.0-p[i])+g[d[i-1]][d[i]]*p[i-1]*p[i];
tmp+=g[c[i-1]][d[i]]*(1.0-p[i-1])*p[i]+g[d[i-1]][c[i]]*p[i-1]*(1.0-p[i]);
f[i][j][1]=min(tmp,f[i-1][j-1][0]+g[c[i-1]][c[i]]*(1.0-p[i])+g[c[i-1]][d[i]]*p[i]);
}
} Ans=1e9;
for(int i=0;i<=m;++i) Ans=min(Ans,min(f[n][i][0],f[n][i][1]));
printf("%.2lf\n",Ans);
return 0;
}

[Noip2016]换教室(期望+DP)的更多相关文章

  1. bzoj4720: [Noip2016]换教室(期望dp)

    4720: [Noip2016]换教室 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1294  Solved: 698[Submit][Status ...

  2. 【bzoj4720】[NOIP2016]换教室 期望dp

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

  3. 【bzoj4720】[Noip2016]换教室 期望dp+最短路

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

  4. JZYZOJ1457 [NOIP2016]换教室 期望dp 动态规划 floyd算法 最短路

    http://172.20.6.3/Problem_Show.asp?id=1457 我不知道为什么我倒着推期望只有80分,所以我妥协了,我对着题解写了个正的,我有罪. #include<cst ...

  5. 洛谷1850(NOIp2016) 换教室——期望dp

    题目:https://www.luogu.org/problemnew/show/P1850 状态里记录的是”上一回有没有申请“,而不是”上一回申请成功否“,不然“申请 j 次”就没法转移了. dou ...

  6. [NOIP2016]换教室 期望dp

    先弗洛伊德,然后把状态拆分遗传 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  7. 洛谷P1850 [noip2016]换教室——期望DP

    题目:https://www.luogu.org/problemnew/show/P1850 注释掉了一堆愚蠢,自己还是太嫩了... 首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选 ...

  8. 换教室(期望+DP)

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

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

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

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

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

随机推荐

  1. 利用rand7()构造rand10()

    题意 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10 参考代码 int rand7() { srand((int)time(NULL)) ...

  2. SpringMVC03 ParameterMethodNameResolver(参数方法名称解析器) And XmlViewResolver(视图解析器)

    参数方法名称解析器 1.配置依赖包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  3. java关于类的构建

    一开始老是把类的构建和代码的重构搞的混淆,现在理解的可能还好点(至少概念上不会出错了),简单的说类就是一个复杂的变量,这个变量里面含有属性.方法和构造方法,注意方法和构造方法是完全不同的两个概念,而且 ...

  4. 解决在eclipse中导入项目名称已存在的有关问题

    新建项目-Import-File System-找到相应的文件夹-Overwrite existing resources without warning打钩,选中项目即可

  5. <script>, <script async>, <script defer> 三种标签的区别

    <script>, <script async>, <script defer> 三种标签的区别 <script>标签 阻塞html parsing 脚 ...

  6. 使用JS实现图片轮播(前后首尾相接)

    最近各种跑面试,终于还是被问到这个,一脑子浆糊,当时没想出来首尾相接怎么搞,回来之后研究了一波,终于搞出来了,不多说,直接看代码 代码参考了一位已经写好了图片轮播功能的(在此表示感谢),但是没有首尾相 ...

  7. 独立安装Oracle Hyperion Enterprise Performance Management 验证过程

    在安装EPM的过程中,都是安装既定的操作手册进行,只是一个过程的重复,对自己安装不会留下深刻的印象.根据自己学习体会,制定安装步骤,去验证自己学习过程中的体会,加深学习印象,解决安装中遇到的问题,模仿 ...

  8. 不该被忽视的CoreJava细节(四)

    令人纳闷的数组初始化细节 这个细节问题我很久以前就想深入研究一下,但是一直没有能够抽出时间,借这系列文章的东风,尽量解决掉这个"心头病". 下面以一维int数组为例,对数组初始化方 ...

  9. Java Annotation使用详解

    Java  Annotation是JDK5.0引入的一种注释机制.它与注释有一定区别,可以理解为代码上的特殊标记,通过这些标记我们可以在编译,类加载,运行等程序类的生命周期内被读取.执行相应的处理.通 ...

  10. 签证-L1/L2

    http://blog.sina.com.cn/s/blog_7664b7f70102uweb.html 14年4月我接到公司通知,要从MICROSTRATEGY中国研发中心内部transfer到美国 ...