动态规划:城市遍历

2024-02-09

我遇到了这个问题:

有两个人。有 n 个城市的有序序列,并且每对城市之间的距离是给定的。您必须将城市划分为两个子序列(不一定是连续的),使得人 A 访问第一个子序列中的所有城市(按顺序),人 B 访问第二个子序列中的所有城市(按顺序),并且使得A 和 B 行驶的总距离最小。假设A和B最初从各自子序列中的第一个城市开始。

我寻找它的答案,答案是:
设 c[i,j] 为第一个人停在城市 i、第二个人停在城市 j 时所行驶的最短距离。假设 i

c[0,j]= k 从 1 到 j-1 的 (d[k,k+1]) 之和
c[i,j] = min(c[k,j]+ d[k,i]) 如果 i!=0 其中 0

解决方法也可参见第10题here http://courses.csail.mit.edu/6.006/fall10/handouts/dpproblems-sol.pdf

现在,我的问题是:
1. 该解没有 i=1 的定义(因为此时 k 没有值)。
2. 现在,假设我们正在寻找 c[2,3]。它将是 c[1,3]+ d[1,2]。现在 c[1,3] 表示人 B 访问了 0、2 和 3,而 A 保留在 1 或 B 访问了 2、3 和 A 访问了 0 和 1。另外,c[2,3] 表示 A 只访问了 2/ 0,1,2 /0,2 /1,2。所以,

 c[1,3] = min(d[0,1]+ d[2,3], d[0,2]+ d[2,3])
 c[2,3] = min(d[0,1]+ d[1,2], d[0,2]+ d[1,3], d[1,2]+d[0,3], d[0,1]+d[1,3])

可以看出,解决方案并不重叠。

换句话说,2已经被c[1,3]中的B覆盖了。因此,如果我们将 c[1,3] 包含在 c[2,3] 中,则意味着 A 和 B 都访问了 2,这不是必需的,因为它只会增加成本。

如果我错了,请纠正我。


Q:: 两人遍历一系列城市:给你一个由 n 个城市组成的有序序列,以及每对城市之间的距离。设计一种算法,将城市划分为两个子序列(不一定是连续的),使得 A 访问第一个子序列中的所有城市(按顺序),B 访问第二个子序列中的所有城市(按顺序),并且A 和 B 行驶的总距离最小。假设A和B最初从各自子序列中的第一个城市开始。

这是我对解决方案的理解::

假设城市的编号是从 1 到 n。我们在 C(i, j) 上递归,即人 A 在城市 i 结束而人 B 在城市 j 结束时行驶的最短距离。不失一般性地假设 i

令 C(0, n) 表示人 A 没有访问任何城市,而人 B 访问 [1, n] 中的所有城市。

因此,C(0, j) = d(1,2) + d(2,3) + .... + d(j-1, j) (B从城市1开始,依次到城市j) 。

C(i, j),其中 i 不为 0 = 以下两种情况的最小值:

情况1:A人在i城市出发和结束。此时,C(i, j) = 人 B 行驶的距离,按顺序前往从 1 到 j 的所有城市,跳过城市 i = d(1,2) + d(2,3) + ... + d(i-1, i+1) + d(i+1, i+2) + ... + d(j-1, j)

情况2:人A在i之前从某个城市出发,因此他在前往城市i(其遍历中的倒数第二个城市)之前经过了一个城市k。在这种情况下,C(i, j) = 最小值 {C(k, j) + d(k, i)},其中 k 可以在 1 到 i-1 之间变化。

该问题的解是最小值 { C(i,n) },其中 i 从 0 变化到 n-1。

我们可以按行主序填充 DP 矩阵,因为 C(i,j) 的每次计算都需要距离 d 或 C(k,j)(其中 k

该算法的运行时间将为 O(n^3),因为我们要计算 O(n^2) 个条目,并且每个计算需要 O(n) 时间。

编辑:: 我认为讲义中给出的解决方案缺少 case1。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划:城市遍历 的相关文章

  • 对二进制二维矩阵进行排序?

    我在这里寻找一些指示 因为我不太知道从哪里开始研究这个 我有一个二维矩阵 每个单元格中有 0 或 1 例如 1 2 3 4 A 0 1 1 0 B 1 1 1 0 C 0 1 0 0 D 1 1 0 0 我想对其进行排序 使其尽可能 上三角
  • 如何生成排列?

    我的问题是 给定一个长度为 n 的列表 L 和一个整数 i 使得 0 对于任意 i 和任意 2 个列表 A 和 B perm A i 和 perm B i 都必须将 A 和 B 的第 j 个元素映射到 A 和 B 相同位置的元素 对于任何输
  • iOS心率检测算法

    我正在尝试在我正在开发的应用程序中实现心跳记录功能 首选方法是使用 iPhone 的摄像头 在灯亮的情况下 让用户将手指放在镜头上 然后检测视频源中与用户心脏相对应的波动 我通过以下堆栈溢出问题找到了一个非常好的起点here https s
  • 比 in_array 更快?

    我需要将一个值与一组数组进行比较 但是 我需要比较 foreach 中的多个值 如果使用 in array 它可能会很慢 非常慢 有没有更快的替代方案 我当前的代码是 foreach a as b in array b array 谢谢 你
  • 生成字符串及其子字符串列表的排列的算法

    我已经忘记这个算法有一段时间了 假设我得到了字符串 cccaatt 我试图生成重复字母的每个子串的所有可能变体 EG cccaatt 作为输入将返回 猫 卡特 猫 卡特 ccat 卡特 卡特彼勒 卡特彼勒 cccat cccat cccaa
  • 用于整数分区的优雅 Python 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我尝试编写代码来解决标准整数分区问题 维基百科 http en wikipedia org wiki Partition 28numb
  • 优化 HTML 属性压缩顺序

    我在某处读到 按一定顺序组织 HTML 属性可以提高 HTML 文档的压缩率 我想我是从 Google 或 Yahoo 推荐的更快网站上读到这篇文章的 如果我没记错的话 建议是将最常见的属性放在第一位 例如id等 然后将其余的按字母顺序排列
  • 计算具有 3 个循环的算法的复杂度

    我尝试解决以下练习 以下代码片段最坏情况运行时间的增长顺序是什么 作为 N 的函数 int sum 0 for int i 1 i lt N i for int j 1 j lt i i j for int k 1 k lt j j k s
  • 运行时间为 O(n) 且就地排序的排序算法

    有没有运行时间为O n 并且还分类到位 在某些情况下 最好的情况是 O n 但这可能是因为项目集合已经排序 你正在看 O nlogn 一些较好的平均值 话虽如此 排序算法的 Wiki 还是相当不错的 有一个表格比较了流行的算法 说明了它们的
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正
  • 一种良好且简单的随机性测量方法

    获取一长整数序列 例如 100 000 个 并返回序列随机性的测量值的最佳算法是什么 该函数应返回单个结果 如果序列并非完全随机 则返回 0 如果完全随机 则返回 1 如果序列有点随机 它可以给出介于两者之间的东西 例如0 95 可能是一个
  • 素数生成器算法

    我一直在尝试解决素数生成算法的SPOJ问题 这是问题 彼得想为他的密码系统生成一些素数 帮助 他 你的任务是生成两个给定之间的所有素数 数字 Input 输入以单行中测试用例的数量 t 开始 t Output 对于每个测试用例 打印所有素数
  • 关于Marching Cubes算法的澄清

    关于Marching Cubes 我对其算法和实现有一些疑问 我已经阅读了 Marching Cubes 的 Paul Bourke 优秀文章以及网站上可用的源代码 但是 我在理解以及如何以自己的方式实现算法方面仍然遇到了一些问题 问题如下
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 如何光栅化旋转矩形(通过 setpixel 在 2d 中)

    我有四个 2d 顶点 A B C D 的旋转矩形 我需要在像素缓冲区中 有效地 光栅化 绘制它 使用 setpixel x y 颜色 怎么做 我正在尝试使用一些代码 例如 convertilg a b c d do up down left
  • 总和不小于 key 的数组的最小子集

    给定一个数组 假设为非负整数 我们需要找到最小长度子集 使得元素之和不小于 K K 是作为输入提供的另一个整数 是否有可能找到时间复杂度为 O n n 的大 oh 的解决方案 我目前的想法是这样的 我们可以在 O n log n 中对数组进

随机推荐

  • 如果与 ClientHttpRequestInterceptor 一起使用,Spring Resttemplate postforobject 将返回 null 作为对象响应

    我正在尝试使用休息服务 并且正在使用 Spring 发布一些数据RestTemplate postForObjectMethod但我收到空响应 即使我可以在有效负载中看到请求和响应 更新 我正在使用拦截器实现ClientHttpReques
  • CI::报告没有为 Ruby Test::Units 生成 xml?

    我正在尝试使用 CI reporter 生成 ruby 单元测试报告 我的耙文件 require rake require rake testtask require rake packagetask require rake requir
  • 两列并排可滚动

    我的页面看起来像这样 我有两个单独的 div 一个是产品过滤器 另一个是产品 div 产品内容可以显示 40 个产品或 100 个产品或无 即内容可以稍后更改 同样 我的过滤器的长度也可以变化 我希望以某种方式使过滤器 div 可滚动 并使
  • 如何将 AWS S3 url 转换为 boto 的存储桶名称?

    我正在尝试访问http s3 amazonaws com commoncrawl parse output segment http s3 amazonaws com commoncrawl parse output segment 桶与
  • OpenCL 动态并行/GPU 生成的线程?

    CUDA 5 刚刚被释放 http nvidianews nvidia com Releases NVIDIA Releases CUDA 5 Making Programming With World s Most Pervasive P
  • Stream 和 Spring Data 的优点

    有些人重写 CrudRepository 的方法 findAll 以返回 Stream java 8 但我看到他们最终将 Stream 转换为 List 以便通过其余控制器发送它 他们为什么使用 Stream 在这里使用 Stream 有什
  • Grails 集成测试不会回滚

    我正在从这本书中学习grails Grails 的实际应用 http my safaribooksonline com book web development ruby 9781933988931 并且我正在尝试从示例中运行集成测试 在书
  • 使用 VLC 托管无限视频循环流

    我想通过 WIFI 网络从带有 VLC 播放器的电脑向智能手机提供视频流以进行回归测试 视频在智能手机上播放完毕后应自动重新开始 我目前使用 rtsp 作为协议和循环选项 但这不是强制性的 问题是 每次视频重新启动时 都需要进行新的 rts
  • 如何检查 Azure 中应用程序网关的运行状况

    如何使用java sdk检查应用程序网关的健康状况 我需要使用 java sdk 执行类似的操作 如下面的 azure cli 命令 天蓝色网络应用程序网关后端运行状况显示 1 2 json jq r backendAddressPools
  • Redis 中的绝对缓存和滑动缓存

    我想在Redis中实现绝对缓存和滑动缓存 有没有人有任何资源链接 这会有帮助 Redis 已经有很多用于此目的的命令 EXPIRE http redis io commands expire 设置按键超时时间 EXPIREAT http r
  • 将 1GB 数据加载到 hbase 需要 1 小时

    我想将 1GB 1000 万条记录 的 CSV 文件加载到 Hbase 中 我为它编写了 Map Reduce 程序 我的代码运行良好 但需要 1 小时才能完成 最后一个Reducer 花费了半个多小时的时间 有人可以帮我吗 我的代码如下
  • 根据 C 标准,写入然后读取不同的联合成员是否未定义? [复制]

    这个问题在这里已经有答案了 我读到这段代码根据 c 标准是未定义的 但我找不到原因 它在 gcc 8 1 0 和 clang 6 0 中编译没有错误并打印 1 代码如下 include
  • pyEphem 'sublat' 和 'sublong' 是在地心还是大地测量中给出的?

    文档说 如果给 pyEpehm 一个 TLE 和一个时间 它将返回以下内容 但是 我无法将返回的 sublat 和 sublon 转换为 ECEF XYZ 并返回 LLA 坐标进行验证 当我转换回来时 经度会被保留 但对于不同的测试 纬度会
  • Gradle Build 停留在生成调试源

    当我尝试构建任务 android generateDebugSources 时 Gradle 陷入困境 我让它运行了几个小时但没有成功构建 我已经在 Android Studio 1 0 0 0 8 1 Gradle 版本 2 1 1 1
  • 用户表单列表框显示一定范围内的值

    我正在尝试在 Excel 中创建一个用户窗体 其中有一个组合框 并且根据所选值 一系列单元格中的值将显示在用户窗体上的列表框中 到目前为止我有这个 Private Sub UserForm Initialize With ComboBox1
  • 从 MYSQL 中的索引号获取工作日名称

    我有一个表 其中存储 0 6 作为工作日值 我想显示工作日名称 例如 如果值为0 它将显示Sunday 如果值为1 它将显示Monday 同样地 是否有内置的 MySQL 函数可以从索引中获取日期名称 提前致谢 正如 Aliminator提
  • 虚拟属性和质量分配

    开发商 我无法理解接下来的情况 例如我有模型 class Pg City lt ActiveRecord Base belongs to country virtual accessors attr accessor population
  • numpy 初学者:使用 numpy.savetxt 编写数组

    我有一个 numpy 直方图 我想将其输出为制表符分隔的文本文件 我的代码如下 targethist np histogram targetlist bins ilist print targethist np savetxt ChrI d
  • cv::Mat 在 Visual C++ Express 2010 中给出错误

    我有 opencv2 1 并在 64 位计算机上使用 Visual C 2010 Express 进行编码 我之前没有遇到问题 我可以使用其他代码 但是下面的简单代码给出了错误 cvMatExample exe 中 0x571365af m
  • 动态规划:城市遍历

    我遇到了这个问题 有两个人 有 n 个城市的有序序列 并且每对城市之间的距离是给定的 您必须将城市划分为两个子序列 不一定是连续的 使得人 A 访问第一个子序列中的所有城市 按顺序 人 B 访问第二个子序列中的所有城市 按顺序 并且使得A