题目链接

思路:
<1>概率与期望
期望=情况①的值*情况①的概率+情况②的值*情况②的概率+……+情况n的值*情况n的概率
举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地后朝上的那一面的期望值就为:1*1/6+2*1/6+3*1/6+4*1/6+5*1/6+6*1/6=21/6=3.5
你们懂的(其实是我不怎么会)
<2>floyd
你们懂的(这一个我是会的)
<3>期望dp
dp[i][j][0]表示在前i个时间段,申请换了j个教室,第i个时间段不申请换教室时的最优解
dp[i][j][1]表示在前i个时间段,申请换了j个教室,第i个时间段申请换教室时的最优解
对于第x次申请,失败的概率为(1-k[x]),成功的概率即为k[x]
对于dp[i][j][0]可以由三种情况转移过来:
1.上一个时间段不申请
2.上一个时间段申请失败
3.上一个时间段申请成功
其中,第2、3种属于同一类
对于dp[i][j][1]可以由六种情况转移过来:
1.上一个时间段不申请,这一个时间段申请失败
2.上一个时间段不申请,这一个时间段申请成功
3.上一个时间段申请失败,这一个时间段申请失败
4.上一个时间段申请失败,这一个时间段申请成功
5.上一个时间段申请成功,这一个时间段申请失败
6.上一个时间段申请成功,这一个时间段申请成功
其中,第1、2种属于同一类,第3、4、5、6种属于同一类。
对于每一种情况,都将所属这一种情况的每一个操作的概率相乘,即可求出这一种情况出现的概率,再乘以相应两个课室之间的最短路径,就可以得出期望值。最后dp[n][1..m][0..1]中的最小值就是答案。
<4>反思
这道题的转移方程很长,然而我一开始并没有换行,然后就有了一个我看不出的错误,然后我提交上去就WA了,然后我冥思苦想一行一行对照题解,然后我还是没能找出错误,然后llx来了叫我对拍,然后我就开始对拍了,然后我就发现了错误,原来是一个地方忘了减一,然后我提交上去就A了,然后就没有然后了……
<完>
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<string>
#include<sstream>
#include<cstring>
using namespace std;
const int INF=10000000;
int c[2005],d[2005],f[305][305];
double k[2005],dp[2005][2005][2];
int main()
{
int n=0,m=0,v=0,e=0;
double ans=INF;
scanf("%d%d%d%d",&n,&m,&v,&e);
if(n==1) { printf("0.00"); return 0; }
for(int i=1;i<=n;i++) scanf("%d",&c[i]);
for(int i=1;i<=n;i++) scanf("%d",&d[i]);
for(int i=1;i<=n;i++) scanf("%lf",&k[i]);
for(int i=1;i<=v;i++)//初始化邻接矩阵
for(int j=1;j<i;j++)
f[i][j]=f[j][i]=INF;
for(int i=1;i<=e;i++)
{
int a=0,b=0,w=0;
scanf("%d%d%d",&a,&b,&w);
f[a][b]=f[b][a]=min(f[a][b],w);//存边
}
for(int T=1;T<=v;T++)//floyd
for(int i=1;i<=v;i++)
for(int j=1;j<i;j++)
f[i][j]=f[j][i]=min(f[i][j],f[i][T]+f[T][j]);
for(int i=1;i<=n;i++)//dp数组初始化
for(int j=0;j<=m;j++)
dp[i][j][0]=dp[i][j][1]=INF;
dp[1][0][0]=dp[1][1][1]=0;//边界条件
for(int i=2;i<=n;i++)//dp
for(int j=0;j<=min(m,i);j++)
{
if(j>0) dp[i][j][1]=min(dp[i-1][j-1][0]+f[c[i-1]][c[i]]*(1-k[i])+f[c[i-1]][d[i]]*k[i],
dp[i-1][j-1][1]+f[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i])+
f[c[i-1]][d[i]]*(1-k[i-1])*k[i]+
f[d[i-1]][c[i]]*k[i-1]*(1-k[i])+
f[d[i-1]][d[i]]*k[i-1]*k[i]);
dp[i][j][0]=min(dp[i-1][j][0]+f[c[i-1]][c[i]],
dp[i-1][j][1]+f[c[i-1]][c[i]]*(1-k[i-1])+
f[d[i-1]][c[i]]*k[i-1]);
if(i==n) ans=min(ans,min(dp[i][j][0],dp[i][j][1]));//维护最小期望值
}
printf("%.2lf",ans);//四舍五入精确到小数点后2位,输出
return 0;
}

Luogu P1850 [NOIp2016提高组]换教室 | 期望dp的更多相关文章

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

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

  2. [NOIp2016提高组]换教室

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

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

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

  4. 换教室(期望+DP)

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

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

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

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

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

  7. P1850 换教室 期望dp

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

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

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

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

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

随机推荐

  1. windows 中cmd一些特殊命令

    chcp 65001  就是换成UTF-8代码页 chcp 936 可以换回默认的GBK chcp 437 是美国英语 shutdown -s -t 60   60秒后关机 shutdown /a  ...

  2. git 报错 gitThere is no tracking information for the current branch. Please specify which branch you w

    新建本地分支后将本地分支推送到远程库, 使用git pull 或者 git push 的时候报错gitThere is no tracking information for the current ...

  3. 深度理解JVM

      1. 环境搭建 安装jdk 2. 内存溢出场景模拟 public class Test01 { public static void main(String[] args) { //测试内存溢出 ...

  4. 鸿蒙内核源码分析(编译脚本篇) | 如何防编译环境中的牛皮癣 | 百篇博客分析OpenHarmony源码 | v58.01

    百篇博客系列篇.本篇为: v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o 本篇用两个脚本完成鸿蒙(L1)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...

  5. P5445-[APIO2019]路灯【set,树状数组套线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P5445 题目大意 \(n+1\)个点,\(i\)和\(i+1\)个点之间有一条边,\(q\)个操作 断开/连接第\ ...

  6. Fiddler抓HTTPS接口数据,安装证书并不复杂,超详细的图文解说,不信你看!

    @ 目录 前言 安装环境 配置网络 IP 端口 配置网络 浏览器打开下载链接 下载证书 安装证书 证书安装坑 前言 抓包是我测试工作中必须要学会的一个工具,我们都知道,抓取HTTPS接口里需要安装证书 ...

  7. Springboot --- Bug集

    一. 启动springboot报错:找不到或无法加载主类 解决:直接选中项目,在ecplise选中"project",点击clean 清理项目再运行 问题解决. 二.报错:Fail ...

  8. redis无法连接

     Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redi ...

  9. Python技法-序列拆分

    Python中的任何序列(可迭代的对象)都可以通过赋值操作进行拆分,包括但不限于元组.列表.字符串.文件.迭代器.生成器等. 元组拆分 元组拆分是最为常见的一种拆分,示例如下: p = (4, 5) ...

  10. VirtualBox设置双网卡实现主宿互访及虚拟机访问互联网总结

    1,配置网络 注:VirtualBox要在全局工具-主机网络管理器里新建一个虚拟网卡. 然后虚拟机的网卡1设置为host-only,界面名称为新建的虚拟网卡(我这里为了不跟主机ip冲突,设置成了不同网 ...