NOIP2016D1T3 换教室

题目大意:有n个时间段,每个时间段i有两个教室a[i],b[i]可以上课,如果不申请换教室就在教室a[i]上课,如果换教室就在b[i]上课。你最多只能换m次教室。教室之间有一些双向路,保证教室两两可以到达。问上完n节课走路长度的数学期望。

题解:这是一道典型的概率dp题。重要的是状态的设计。

我们令dp[i][j][0/1]代表:第i个时间段换了j次课室这次换(0)还是不换(1)的数学期望。需要注意的是因为要满足dp的无后效性,必须要加上dp状态的第三维代表这一次还还是不换。

根据上次换还是不换和这次换还是不换, 那么就有4种结果。

dp[i][j][0]=min(dp[i-1][j][0]+上次和这次都不换的期望代价,dp[i-1][j][1]+上次换这次不换的期望代价);

dp[i][j][1]=min(dp[i-1][j-1][0]+上次不换这次换的期望代价,dp[i-1][j-1][1]+上次和这次都换的期望代价);

dp边界为dp[1][0][0]=dp[1][0][1]=0;   答案为在i==n中取最小值。

这道题还是有一些细节(期望代价的计算)得看代码的。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=+;
const int V=+;
const int INF=0x3f3f3f3f;
int n,m,v,e;
int a[N],b[N],map[V][V];
double k[N],dp[N][N][]; void floyd() {
for (int k=;k<=v;k++)
for (int i=;i<=v;i++)
for (int j=;j<=v;j++)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
} int main()
{
scanf("%d%d%d%d",&n,&m,&v,&e);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
for (int i=;i<=n;i++) scanf("%d",&b[i]);
for (int i=;i<=n;i++) scanf("%lf",&k[i]);
memset(map,0x3f,sizeof(map));
for (int i=;i<=v;i++) map[i][i]=;
for (int i=;i<=e;i++) {
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if (map[x][y]>z) map[x][y]=z;
if (map[y][x]>z) map[y][x]=z;
} floyd(); for (int i=;i<=n;i++) for (int j=;j<=m;j++) dp[i][j][]=dp[i][j][]=INF;
dp[][][]=;
dp[][][]=;
double ans=INF;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) {
double w1=map[a[i-]][a[i]],w2=map[a[i-]][b[i]];
double w3=map[b[i-]][a[i]],w4=map[b[i-]][b[i]];
dp[i][j][]=min(dp[i-][j][]+w1,dp[i-][j][]+w1*(-k[i-])+w3*k[i-]);
double temp=w1*(-k[i-])*(-k[i])+w2*(-k[i-])*(k[i])+w3*(k[i-])*(-k[i])+w4*(k[i-])*(k[i]);
if (j) dp[i][j][]=min(dp[i-][j-][]+w1*(-k[i])+w2*(k[i]),dp[i-][j-][]+temp); if (i==n) ans=min(ans,min(dp[i][j][],dp[i][j][]));
}
printf("%.2lf",ans);
return ;
}

NOIP2016D1T3 换教室 (概率DP)的更多相关文章

  1. P1850 换教室 概率dp

    其实说是概率dp,本质上和dp没什么区别,就是把所有可能转移的情况全枚举一下就行了,不过dp方程确实有点长... ps:这个题的floyed我竟然之前写跪了... 题目: 题目描述 对于刚上大学的牛牛 ...

  2. luogu 1850 换教室 概率+dp

    非常好的dp,继续加油练习dp啊 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) ...

  3. 换教室(期望+DP)

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

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

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

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

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

  6. Bzoj 4720 换教室 (期望DP)

    刚发现Bzoj有Noip的题目,只会换教室这道题..... Bzoj 题面:Bzoj 4720 Luogu题目:P1850 换教室 大概是期望DPNoip极其友好的一道题目,DP不怎么会的我想到了,大 ...

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

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

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

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

  9. P1850 换教室 期望dp

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

随机推荐

  1. 二、Angular项目创建、安装、启动

    1.项目创建,进入预先存放项目的路径,命令行执行 ng new ProjectName 创建成功后的项目 2.项目安装,进行项目中执行命令 npm install  3. 项目运行,执行命令 ng s ...

  2. java 字符串的截取、转换、分割

    1.截取 package java07; /* 字符串的截取方法: public String substring(int index):截取从参数位置一直到字符串末尾,返回新字符串 public S ...

  3. jenkins持续集成(三): jenkins配置邮件通知

    完成基于jenkins的持续集成部署后,任务构建执行完成,测试结果需要通知到相关人员.这篇博客,介绍如何在jenkins中配置邮件通知的方法... 一.安装邮件插件 由于Jenkins自带的邮件功能比 ...

  4. AGC001[BCDE] 题解

    A没意思 F太难 所以大概近期的AGC题解都是BCDE的 然后特殊情况再说 开始刷AGC的原因就是计数太差 没有脑子 好几个学长都推荐的AGC所以就开始刷了 = = 大概两天三篇的速度?[可能也就最开 ...

  5. 转载:Eclipse下的java工程目录

    原文链接:https://www.cnblogs.com/milantgh/p/4029003.html 对新手来讲,一个Java工程内部的多个文件夹经常会让大家困惑.更可恶的是莫名其妙的路径问题,在 ...

  6. Thymeleaf入门到吃灰

    Thymeleaf 官网部分翻译:反正就是各种好 Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎 Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymel ...

  7. WRNavigationBar 使用记录

    最近在做一个导航栏透明度渐变的效果,发现 WRNavigationBar库很好用,一开始导入到项目,发现导航tiltle颜色一直是黑色的,无论怎么用系统方法改都改不了.后来发现原来库里面有一个方法可以 ...

  8. php addcslashes()函数 语法

    php addcslashes()函数 语法 作用:返回在指定字符前添加反斜杠的字符串 语法:addcslashes(string,characters) 参数: 参数 描述 string  必须,规 ...

  9. 4412 gpio读取pwm

    一.可以使用的GPIO管脚 去掉占用调用的GPIO驱动,包括leds,buzzer,camera ov5640,WIFI mt6620 ,Keyboards VIDEO_OV5640– Device ...

  10. mysql联合查询sql优化

    我们在使用mysql数据库时,经常会使用到mysql的联合查询,联合查询分为内连接和外连接,内连接查询结果是联合的表都存在匹配才会有结果,外连接则根据驱动表是否存在匹配来生成结果集. 这里使用mysq ...