题目链接

思路:
<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. CodeForce-785B Anton and Classes(简单贪心)

    Anton and Classes Anton likes to play chess. Also he likes to do programming. No wonder that he deci ...

  2. 解决idea debugger Frames are not available

    现象:idea2017.3.7 sofaboot项目debugger报错 Frames are not available. 之前好用,不知道为啥突然不能debugger,run能正常运行代码.如下图 ...

  3. Elasticsearch(ES)的滚动搜索与批量操作

    1. 概述 今天我们来聊一下Elasticsearch(ES)的滚动搜索与批量操作. 2. Elasticsearch(ES)的滚动搜索 2.1 概述  滚动搜索我们经常能够用到,例如:推荐列表,此类 ...

  4. vscode 本地启动配置

    安装vscode 编辑器后,找到插件 1.安装Debugger for Chrome 2.找到本地需要启动的项目,配置文件,从左到右依次点击红圈中的按钮,然后出现launch.json文件,在里面添加 ...

  5. 总结了下PHPExcel官方读取的几个例子

    1.使用 PHPExcel_IOFactory 读取文件 $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); 2.使用一个特定的读取类,读 ...

  6. YbtOJ#631-次短路径【左偏树,最短路】

    正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/1 题目大意 给出\(n\)个点\(m\)条边的一张无向图,对于每个点\(i\)求不经过\(i ...

  7. "错误: 找不到或无法加载主类"解决办法

    前言:记上次一个找了个把小时的问题(很烦这些配置) 原因: 从svn下checkOut的项目 在application的配置的输出class路径为main,而class文件路径是在项目名的根路径下,所 ...

  8. 解决报错:The import javax.servlet.annotation cannot be resolved

    maven项目,引入javax.servlet.annotation.WebServlet的jar包,使用@WebServlet注解来实现对传统web.xml中servlet和url的映射 报错:Th ...

  9. Markdown学习 Day 001

    Markdown学习 Day 001 快速标题 "#" + "空格" + "标题内容",回车即可,PS. "#"数量n代 ...

  10. Kronecker product

    Kronecker product 的基本运算 结合律 \begin{equation} \mathrm{A} \otimes (\mathrm{B + C}) = \mathrm{A} \otime ...