【DP】【期望】$P1850$换教室

【DP】【期望】\(P1850\)换教室

链接

题目描述

\(2n\) 节课程安排在$ n$ 个时间段上。在第 \(i\)\(1 \leq i \leq n\))个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 \(c_i\)上课,而另一节课程在教室 \(d_i\)进行。

在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 \(n\)节安排好的课程。如果学生想更换第 \(i\)节课程的教室,则需要提出申请。若申请通过,学生就可以在第 $i $个时间段去教室 \(d_i\) 上课,否则仍然在教室 \(c_i\)上课。

牛牛发现申请更换第\(i\)节课程的教室时,申请被通过的概率是一个已知的实数 \(k_i\),并且对于不同课程的申请,被通过的概率是互相独立的。

所有的申请只能一次性提交,并且每个人只能选择至多 \(m\)节课程进行申请。

牛牛所在的大学有 \(v\)个教室,有 \(e\) 条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,通过不同的道路耗费的体力可能会有所不同。 当第 \(i\)\(1 \leq i \leq n-1\))节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。

现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小。

输入格式

第一行四个整数 \(n,m,v,e\)

第二行 \(n\) 个正整数,第 \(i\)\(1 \leq i \leq n\))个正整数表示 c\(c_i\),即第\(i\)个时间段牛牛被安排上课的教室;保证 \(1 \le c_i \le v\)

第三行 \(n\) 个正整数,第 \(i\)\(1 \leq i \leq n\))个正整数表示 \(d_i\),即第 $i $个时间段另一间上同样课程的教室;保证 \(1 \le d_i \le v\)

第四行 \(n\) 个实数,第 \(i\)\(1 \leq i \leq n\))个实数表示 \(k_i\),即牛牛申请在第 \(i\)个时间段更换教室获得通过的概率。保证 \(0 \le k_i \le 1\)

接下来 \(e\) 行,每行三个正整数 \(a_j, b_j, w_j\),表示有一条双向道路连接教室 \(a_j, b_j\),通过这条道路需要耗费的体力值是 \(w_j\);保证 \(1 \le a_j, b_j \le v\)\(1 \le w_j \le 100\)

保证 \(1 \leq n \leq 2000\)\(0 \leq m \leq 2000\)\(1 \leq v \leq 300\)\(0 \leq e \leq 90000\)

保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。

保证输入的实数最多包含 \(3\)位小数。

输出格式

输出一行,包含一个实数,四舍五入精确到小数点后恰好\(2\)位,表示答案。你的输出必须和标准输出完全一样才算正确。

测试数据保证四舍五入后的答案和准确答案的差的绝对值不大于 \(4 \times 10^{-3}\)。 (如果你不知道什么是浮点误差,这段话可以理解为:对于大多数的算法,你可以正常地使用浮点数类型而不用对它进行特殊的处理)

样例

3 2 3 3
2 1 2
1 2 1
0.8 0.2 0.5 
1 2 5
1 3 3
2 3 1
2.80

提示

  1. 道路中可能会有多条双向道路连接相同的两间教室。 也有可能有道路两端连接的是同一间教室。
  2. 请注意区分\(n,m,v,e\)的意义, \(n\)不是教室的数量, \(m\)不是道路的数量。

\(Solution\)

考虑DP。状态怎么设?显然第几节课需要在状态里。还要保证最多换\(m\)次,因此次数也要在状态里。那么,怎么从上一节课转移呢?显然如果我们不知道上一节课在哪个教室上的,就无法转移。因此,还要在加一维,记录当前是否申请换教室。

因此,状态就是\(f[i][j][k], 1 \leq i \leq n, 0 \leq j \leq m, 0 \leq k \leq 1\),表示前\(i\)节课,换了\(j\)次教室,第\(i\)次换或不换的期望。

至于转移则比较简单了

f[i][j][0] = min(f[i - 1][j][0] + w[c[i]][c[i - 1]], f[i - 1][j][1] + w[c[i]][d[i - 1]] * k[i - 1] + w[c[i]][c[i - 1]] * (1 - k[i - 1]));
f[i][j][1] = min(f[i - 1][j - 1][0] + w[c[i]][c[i - 1]] * (1 - k[i]) + w[d[i]][c[i - 1]] * k[i],f[i - 1][j - 1][1] + w[d[i]][d[i - 1]] * k[i - 1] * k[i] + w[c[i]][c[i - 1]] * (1 - k[i - 1]) * (1 - k[i])+ w[c[i - 1]][d[i]] * (1 - k[i - 1]) * k[i]+ w[d[i - 1]][c[i]] * k[i - 1] * (1 - k[i]));

如图为当前不选择换教室

2

如图为当前选择换教室

这道题还有几点需要主意的,在预处理部分。具体看代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
long long read(){long long x = 0; int f = 0; char c = getchar();while(c < '0' || c > '9') f |= c == '-', c = getchar();while(c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();return f? -x:x;
}int n, m, V, E, c[2002], d[2002], w[305][305];
double f[2002][2002][2], k[2002], ans;
int main(){memset(w, 63, sizeof w);//距离初始化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", &k[i]);for(int i = 1; i <= E; ++i){int x = read(), y = read(), z = read();w[x][y] = w[y][x] = min(w[x][y], z);//有可能重边}for(int l = 1; l <= V; ++l)for(int i = 1; i <= V; ++i)for(int j = 1; j <= V; ++j)w[i][j] = min(w[i][j], w[i][l] + w[l][j]);//floyed最短路for(int i = 1; i <= V; ++i) w[i][i] = w[i][0] = w[0][i] = 0;//初始化for(int i = 1; i <= n; ++i) f[i][0][0] = f[i - 1][0][0] + w[c[i]][c[i - 1]], f[i][0][1] = 1e9;//初始化,处理一个也不申请的情况for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j){f[i][j][0] = min(f[i - 1][j][0] + w[c[i]][c[i - 1]], f[i - 1][j][1] + w[c[i]][d[i - 1]] * k[i - 1] + w[c[i]][c[i - 1]] * (1 - k[i - 1]));f[i][j][1] = min(f[i - 1][j - 1][0] + w[c[i]][c[i - 1]] * (1 - k[i]) + w[d[i]][c[i - 1]] * k[i],f[i - 1][j - 1][1] + w[d[i]][d[i - 1]] * k[i - 1] * k[i] + w[c[i]][c[i - 1]] * (1 - k[i - 1]) * (1 - k[i])+ w[c[i - 1]][d[i]] * (1 - k[i - 1]) * k[i]+ w[d[i - 1]][c[i]] * k[i - 1] * (1 - k[i]));}double ans = f[n][0][0];for(int i = 1; i <= m; ++i) ans = min(ans, min(f[n][i][1], f[n][i][0]));//更新答案printf("%.2lf", ans);return 0;
} 

转载于:https://www.cnblogs.com/kylinbalck/p/11258482.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发服务器逻辑处理瓶颈,如何解决?

https://mp.weixin.qq.com/s/GHHHvgURdZpNJ1Ec6RHgPg 高并发衡量指标 响应时间&#xff1a;系统对请求做出响应的时间&#xff0c;即一个http请求返回所用的时间&#xff1b;吞吐量&#xff1a;单位时间内处理的请求数量&#xff1b;QPS&#xff08;TPS&#xff09;&#xff1a…

Java 8 StampedLocks与ReadWriteLocks和同步

同步部分就像访问您的岳父母。 您希望尽可能少出现。 关于锁定&#xff0c;规则是相同的–您想花费最短的时间在关键区域内获取锁定&#xff0c;以防止形成瓶颈。 锁定的核心语言惯用法一直是用于方法和离散块的synced关键字。 这个关键字实际上已硬连接到HotSpot JVM中。 我们…

MSN on 2/16/2009

转载于:https://www.cnblogs.com/zxlin25/archive/2009/02/16/1391207.html

开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等

在上篇随笔《基于微信小程序的系统开发准备工作》介绍了开发微信小程序的一些前期的架构设计、技术路线 、工具准备等方面内容&#xff0c;本篇随笔继续这个步骤&#xff0c;逐步介绍我们实际开发过程中对SSL协议的申请及后期处理过程&#xff0c;包括证书的IIS端口绑定&#x…

【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。

在不同编程语言中&#xff0c;控制成员&#xff08;变量、方法、类等&#xff09;可见性的机制不尽相同。以下是对比JavaScript、Go、Ada、Python、C、Java、PHP所使用的访问限制关键字和约定&#xff1a; 一、JavaScript ### JavaScript访问限制 早期的JavaScript并没有类似…

Web API应用架构设计分析(1)

Web API 是一种应用接口框架&#xff0c;它能够构建HTTP服务以支撑更广泛的客户端&#xff08;包括浏览器&#xff0c;手机和平板电脑等移动设备&#xff09;的框架&#xff0c; ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。本文主要以AS…

MapXtreme2008中操作矢量符号和定制符号

本文部分说明内容摘自网络文章&#xff0c;经过本人在MapXtreme2008中编写相关的演示例子&#xff0c;详细说明如何操作MapXtreme2008提供的矢量符号和定制符号。 MapXtreme 在其安装过程中自动安装 10 种 MapInfo 特定的 TrueType 字体。这些字体为用户提供了字形符号选择&am…

转载:97特瑞心得

单位里无聊打着玩的心得&#xff0c;写了段时间了&#xff0c;基本是哪天想到什么就打上去&#xff0c;狗屁不通的地方请大家包涵。97特瑞玩了有10年多了吧,97刚出来的时候就玩的特瑞&#xff0c;别人都八神&#xff0c;萝卜特&#xff0c;克拉克的时代我就坚持用特瑞&#xff…

吸气剂/设定者。 邪恶。 期。

从2003年开始&#xff0c;艾伦霍鲁布&#xff08;Allen Holub&#xff09;讨论了为什么吸气剂和塞特方法是邪恶的著名文章&#xff0c;关于吸气剂/塞特方法是否是反模式&#xff0c;应该避免使用&#xff0c;还是我们在面向对象中不可避免地需要它&#xff0c;这是一个古老的争…

【原】.Net创建Excel文件(插入数据、修改格式、生成图表)的方法

1.添加Excel引用 可以在.Net选项卡下添加Microsoft.Office.Interop.Excel引用&#xff0c;或在COM下添加Microsoft Excel 12.0 Object Library。它们都会生成Microsoft.Office.Interop.Excel.dll。 2.创建Excel。 有两种方法创建一个Excel Workbook实例。 1.需要一个模板文件&…

求助:安装程序无法创建一个DCOM用户帐号来注册.....\valec.exe

http://support.microsoft.com/kb/257413/ 这是Visual Studio的一个BUG&#xff0c;只出现在Windows 2000/XP下。如果你不使用Visual Studio Analyzer&#xff0c;可以在安装时选择Custom&#xff0c;然后在Enterprise Tools中清除掉Visual Studio Analyzer。再安…

js中split()和join()的用法

Split()方法&#xff1a;把一个字符串分割成字符串数组 如上所示&#xff1a;把字符串a按空格分隔&#xff0c;得3个字符串数组。 在如&#xff1a; var a”hao are you” a.split(“”); 得到[h,a,o,a,r,e,y,o,u]; Join方法: 把数组中的所有元素转换为一个字符串 如上图所…

IT行业经典面试题,121套面试题

IT行业经典面试题&#xff0c;121套面试题 资源大小&#xff1a; 580.80KB资源类型&#xff1a;发布人&#xff1a; eyelife 发布日期&#xff1a; 2天前Tag&#xff1a; 名企,计算机 资源分&#xff1a; 10下载人数&#xff1a; 857 4.33/347人评分 12 3 4 5 评论 分享…

词云第一次实践,参考学校老师讲的一些知识点还有网上大佬的代码实现

from wordcloud import WordCloudimport cv2import jiebawith open(1906月考.txt, r, encodingutf-8) as f: # 以读的方式打开词云参考的文档 text f.read() # 阅读cut_text .join(jieba.cut(text)) # 通过jieba库的cut精确模式进行分词# 得到词云形状color_mask cv2…

Spring Integration 4.0:完整的无XML示例

1.简介 Spring Integration 4.0终于发布了 &#xff0c;并且此版本具有非常好的功能。 本文介绍的一种可能性是完全不使用XML即可配置集成流程。 那些不喜欢XML的人仅使用JavaConfig就可以开发集成应用程序。 本文分为以下几节&#xff1a; 介绍。 流程概述。 弹簧配置。 …

CSS伪类的三种写法

今天逛蓝色时&#xff0c;无意发现了有人讨论伪类的正确写法&#xff0c;让我对伪类的认识也更清晰了&#xff0c;转贴于此&#xff0c;以备日后查询(原贴当时没记下地址&#xff0c;已经记不得了) Code<style>a.tb{text-decoration:none;}a.tb:link{color:#FF9900;}a.tb…

如何通过示例在Java中使用CopyOnWriteArraySet

CopyOnWriteArraySet是CopyOnWriteArrayList类的弟弟。 这些是专用集合类&#xff0c;这些类是在JDK 1.5上添加的&#xff0c;以及它们最流行的表亲ConcurrentHashMap 。 它们是并发收集框架的一部分&#xff0c;位于java.util.concurrent包中。 CopyOnWriteArraySet最适合作为…

生成器

一、什么是生成器 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;受到内存限制&#xff0c;列表容量是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用很大的存储空间&#xff0c;如果我们仅仅需要访问前面几个元素&#…

面向对象的三大特征 封装继承多态

面向对象设计 和开发程序的好处 交流更加流畅 、提高设计和开发效率 封装将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;而是通过该类提供的方法来实现对隐藏信息的操作和访问私有化属性 提供公有化的访问方法 保证数据的安全性封装的步骤 …

Spring / Hibernate应用程序的性能调优

对于大多数典型的Spring / Hibernate企业应用程序&#xff0c;应用程序性能几乎完全取决于其持久层的性能。 这篇文章将讨论如何确认我们是否存在“数据库绑定”应用程序&#xff0c;然后逐步讲解7个经常使用的“快速取胜”技巧&#xff0c;这些技巧可以帮助提高应用程序性能。…