通过需要考虑多种成本的矩阵的最佳路径

2023-12-02

例如给出以下矩阵:

[[[0, 8], [0, 3], [0, 8]],
 [[8, 0], [3, 0], [0, 5]],
 [[0, 1], [0, 6], [0, 0]]]

对于每个元组,第一个数字是食物,第二个数字是水。我需要从右下角到左上角,并且只能向上或向左移动。

我需要收集尽可能多的食物和水,这样我才能活得尽可能长。为了生存,我每天需要 1 份食物和 1 份水,因此,如果我可以在一条导致 (7,4) 的路径和一条导致 (6,6) 的路径之间进行选择,则正确的选择是 (6,6 )因为这可以让我活 6 天。

如何通过所述矩阵找到最佳路径?

我当前的代码在下面,但它不起作用(它找到了一条成本非常高的路径,但不是最高的),我不知道如何去做。我不知道如何开始实现它,尽管我被告知要避免递归。

def maxSuppliesPath(matrix):
n = len(matrix) - 1
bestPath = matrix

# Initialize first column of bestPath array
for i in range(1, n + 1):
    if bestPath[i][0] == 0:
        bestPath[i][0] = bestPath[i - 1][0]
    else:
        bestPath[i][0] = (bestPath[i][0][0] + bestPath[i - 1][0][0], bestPath[i][0][1] + bestPath[i - 1][0][1])

# Initialize first row of bestPath array
for j in range(1, n + 1):
    if bestPath[0][j] == 0:
        bestPath[0][j] = bestPath[0][j - 1]
    else:
        bestPath[0][j] = (bestPath[0][j - 1][0] + bestPath[0][j][0], bestPath[0][j - 1][1] + bestPath[0][j][1])



# Construct rest of the bestPath array
for i in range(1, n + 1):
    for j in range(1, n + 1):
        if min(bestPath[i][j - 1][0] + bestPath[i][j][0], bestPath[i][j - 1][1] + bestPath[i][j][1]) > min(
                bestPath[i - 1][j][0] + bestPath[i][j][0], bestPath[i - 1][j][1] + bestPath[i][j][1]):
            bestPath[i][j] = (bestPath[i][j - 1][0] + bestPath[i][j][0], bestPath[i][j - 1][1] + bestPath[i][j][1])
        else:
            bestPath[i][j] = (bestPath[i - 1][j][0] + bestPath[i][j][0], bestPath[i - 1][j][1] + bestPath[i][j][1])

return min(bestPath[n][n][0], bestPath[n][n][1])

解决问题的第一步是了解如何遍历矩阵。下图显示了从起点到其他点的距离。

enter image description here

请注意,等距点排列在对角线上。给定一个set(叫它A)代表一条对角线,下一条对角线上的点(称之为B) 的发现如下:

for each point in set A
    if the x coordinate is greater than zero
        add (x-1, y) to set B
    if the y coordinate is greater than zero
        add (x, y-1) to set B

在示例中,表示对角线的集合应如下所示:

[(2, 2)]                  // starting position
[(1, 2), (2, 1)]          // after 1 move
[(2, 0), (1, 1), (0, 2)]  // after 2 moves
[(0, 1), (1, 0)]          // after 3 moves
[(0, 0)]                  // after 4 moves

下图显示了可以使用多少条不同的路径来到达矩阵中的每个点。路径数与中的数字相同帕斯卡三角形。就这个问题而言,唯一重要的是数字增长很快,因此我们需要减少计数。

enter image description here enter image description here

为了减少路径计数,我们需要在遍历矩阵时剔除非生产性路径。这是通过比较元组来完成的,其中每个元组都包含食物和水。一个元组(F,W)支配一个元组(f,w) iff F >= f AND W >= w.

例如,考虑矩阵中的中心位置。我们可以通过先向上然后向左移动,或者先向左然后向上移动来到达该点。先向上再向左移动的产量(食物、水)为(3,5),而先向左然后向上移动的产量(3,6)。 (3,6)支配(3,5),所以我们只需要考虑(3,6)。所以经过两次移动之后,我们就出现了下图所示的情况。请注意,我们在中心位置只有 1 个元组,而不是帕斯卡三角形预测的两个元组。

enter image description here

经过三步后,我们得到如下所示的情况。第三对角线上的每个点都有两个元组。这是必要的,因为其中一个元组有更多的食物,另一个元组有更多的水,所以两个元组都不会支配另一个元组。

enter image description here

经过四次移动后,我们有四种可能的答案,选择最好的只是一个简单的比较问题min(food, water)对于每个元组。

enter image description here

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

通过需要考虑多种成本的矩阵的最佳路径 的相关文章

  • 如何从本地模式下运行的 pyspark 中的 S3 读取数据?

    我正在使用 PyCharm 2018 1 使用 Python 3 4 并通过 virtualenv 中的 pip 安装 Spark 2 3 本地主机上没有安装hadoop 因此没有安装Spark 因此没有SPARK HOME HADOOP
  • 如何获取Python对象父级?

    所以 我试图获取自定义对象 内部 的对象 这是一个例子 假设 o 是一个对象 无论是什么类型 它都可以存储变量 o Object class Test def init self self parent o This is where I
  • 反转 Python 整数的位

    给定一个十进制整数 例如 65 如何反转 Python 中的底层位 即以下操作 65 01000001 10000010 130 看来这个任务可以分为三步 将十进制整数转换为二进制表示形式 反转位 转换回十进制 第 2 步和第 3 步看起来
  • Daphne Django 文件上传大小限制

    我使用 Daphne 进行套接字和 http 连接 我正在运行 4 个工作容器 并且现在在 docker 容器中本地运行所有内容 如果我尝试上传 400MB 的文件 我的 daphne 服务器会失败 它适用于最大 15MB 的小文件 我的
  • 扭曲的日志记录到屏幕(标准输出)不起作用

    我有这个小程序取自这里 https twistedmatrix com documents 16 3 0 core howto logger html usage for emitting applications from twisted
  • 字符串中数字的连续相加

    我是一名正在学习 python 的新程序员 并且在如何完成此任务方面遇到了困难 所以本质上我有一个从文件导入的数字字符串需要读取 并且需要将第一个数字的总和添加到第二个数字并将其转换为正确的 ascii 字符 因此 例如 如果我正在读取字符
  • 如何将多个 Excel 工作表转换为 csv python

    我想转换所有的excel文档 xls 将工作表转换为 csv 如果 excel 文档只有一张工作表 那么我将进行如下转换 wb open workbook path1 sh wb sheet by name Sheet1 csv file
  • 组内条件计数

    我想在之后进行条件计数groupby 例如 按列的值分组A 然后计算每组中值出现的频率5出现在列中B 如果我整个过程都这样做DataFrame 只是len df df B 5 所以我希望我能做到df groupby A df B 5 siz
  • 使用unittest时如何知道每次测试花费的时间?

    Unittest 仅显示运行所有测试所花费的总时间 但不单独显示每个测试所花费的时间 使用unittest时如何添加每个测试的计时 我想 目前不可能 http bugs python org issue4080 http bugs pyth
  • 初始化整数变量以进行比较

    我正在学习麻省理工学院的开放课件课程计算机科学和 Python 编程简介 https ocw mit edu courses electrical engineering and computer science 6 0001 introd
  • XGBoostLibraryNotFound:在候选路径中找不到 XGBoost 库,您是否安装了编译器并在根路径中运行了 build.sh?

    我在移动 XGBoost 的 python package 目录时遇到这个问题 Traceback most recent call last File setup py line 19 in LIB PATH libpath find l
  • 如何通过不规则索引获取子张量?

    我想通过不规则索引获得子张量 这是我的问题 Input tensor 2x8x10x1 Batch x Height x Width x Channel index Height 0 1 4 5 index Width 0 1 4 5 8
  • Django 模板:输出带有所有小数位的浮点数

    我如何在 django 模板中输出这个数字 小数位数是可变的 我事先不知道 x 0 000015 1 x 输出是 1 5e 05 2 x stringformat f 输出是 0 000015 这不是本地化的 应该有逗号 我需要对输出进行本
  • 优化 Haskell 内循环

    仍在 Haskell 中进行 SHA1 实现 我现在已经有了一个有效的实现 这是内部循环 iterateBlock Int gt Word32 gt Word32 gt Word32 gt Word32 gt Word32 gt Word3
  • 获取SVG绘图的边界框

    我想提取 SVG 绘图的边界框 由于 Python 已经在系统上可用并且还用于执行其他任务 因此我不想使用 JavaScript 或任何其他语言 我的理解是是否可以计算单个元素的边界框 但我不知道如何计算 整个绘图的边界框只是所有元素的最小
  • Spyder 内联绘图

    设置 Anaconda 2 0 0 Win 64 Spyder Anaconda 附带的 2 3 0rc 我配置图形 工具 gt 首选项 gt iPython 控制台 gt 图形 gt 图形后端 gt 内联 但无论我做什么 图形总是在单独的
  • 在未运行 python 中的函数的情况下检查了非本地语句[重复]

    这个问题在这里已经有答案了 以前我认为当我们定义一个函数时 该函数可能是错误的 但python在执行之前不会检查它 x 100 def f x 1 0 return x print x gt gt gt 100 然而 当我学习的时候nonl
  • df.style.apply 在显示中居中显示多索引值

    当我跑步时 import pandas as pd from IPython display import display df pd DataFrame a index pd MultiIndex from product 0 1 3 c
  • 2D 矩阵上的 Numpy where()

    我有一个像这样的矩阵 t np array 1 2 3 foo 2 3 4 bar 5 6 7 hello 8 9 1 bar 我想获取行包含字符串 bar 的索引 在一维数组中 rows np where t bar 应该给我索引 0 3
  • 如何使用 python 在 XML 声明后添加注释

    import xml etree ElementTree as ET def addCommentInXml fileXml C Users Documents config xml tree ET parse fileXml root t

随机推荐

  • Android 屏幕关闭时的 TYPE_STEP_DETECTOR

    您好 我正在开发一个计步器应用程序 该应用程序使用 Android KitKat 的 TYPE STEP DETECTOR 传感器类型 一切似乎都工作正常 直到我关闭屏幕或锁定手机 我发现屏幕关闭时它不会触发事件 我知道 TYPE STEP
  • Ruby Sequel:查询返回的数组作为 String 对象返回,而不是 Array 对象

    我正在使用pg arrayRuby Sequel 的扩展 当我选择 Postgresql 数组的列时 结果是 Ruby 中的字符串 我如何让它成为一个 Ruby 数组 以便我可以在上面使用 each 之类的东西 CaseTypeCatego
  • rmarkdown 中的 python(网状)

    我正在尝试在 rmarkdown 文档中添加 python 块 我安装了包 reticulate 然后这是我的文档 r message FALSE warning FALSE echo FALSE library reticulate py
  • 使用 .net 和 c# 从任务栏中删除应用程序图标

    我试图在任务栏上显示图标 我就是这样做的 ResourceManager resManager new ResourceManager TestAgent Properties Resources GetType Module Assemb
  • Mysql:如何在 LOAD DATA INFILE 查询中使用 RTRIM?

    在我的代码中 我有一个如下所示的查询 load query LOAD DATA LOCAL INFILE file INTO TABLE table FIELDS TERMINATED BY ENCLOSED BY 以下是我尝试加载的文件中
  • AngularJS中ng-repeat和collection-repeat之间的区别?

    我对 ng repeat 和 collection repeat 有一点困惑 NG 重复
  • 在 Chrome 中内联 javascript 重定向之前中断 javascript

    我正在查看一个具有内联 JavaScript 重定向的页面 window location anotherpage 我想在 Chrome 中加载页面 但禁用了重定向行 这样我就可以使用该页面而不会被重定向 这是我尝试过的 开发者工具 gt
  • 使用依赖注入框架时的抽象工厂

    我想知道在使用 DI 框架时如何正确使用抽象工厂 并且该工厂中的参数之一是应该由 DI 框架处理的依赖项 我不确定是否让我的抽象工厂完全省略参数 然后使用我的 DI 容器来连接它 或者是否应该将依赖项传递给对象 例如 我有一个 TcpSer
  • 两个片段之间的 onItemClickListener

    我对 android 很陌生 我已经尝试过 但无法找出我缺少的东西 我正在使用两个片段来显示列表 现在 当用户单击第一个列表项时 我想更改第二个片段中的列表数据 默认情况下 将选择零位置索引以在第二个列表中显示数据 我正在使用自定义数组适配
  • 如果第二个字段长于 7 个字符,则 awk 或 perl 单行打印行

    我有一个1000行的文件 每行有2个单词 用空格分隔 仅当最后一个单词长度大于 7 个字符时 如何打印每一行 我可以使用 awk RLENGTH 吗 perl 有没有简单的方法 OP 调用时使用 awk 的 RLENGTHmatch 功能
  • 如何在 Windows Phone 8 中解压缩文件

    是否可以在 Windows Phone 8 上的应用程序上解压缩文件 大多数库使用 Windows Phone 7 但不使用 Windows Phone 8 Even System IO Compression ZipFile不在这里 将此
  • 如何在android中使用SQLite数据库生成不同类型的报告?

    我正在开发一个Android应用程序 我需要在其中生成各种格式的不同类型的报告 我想生成 PDF XLS DOC 和文本文件格式的报告 所有数据都存储在SQLite数据库中 请指导我如何在android中实现它 您好 您可以使用以下代码生成
  • Cakephp 2.0 行/记录级 Acl

    我正在摆弄 cakephp 2 0 的访问列表 到目前为止 我按照文档创建了一个非常简单的示例 我已经建立了一个用户表和最重要的功能 如索引 添加 登录ecc 并且与组表相关 每个用户属于一个组 我还创建了一个 房屋 表 其中包含不同的内容
  • twilio 捕获错误不起作用

    我正在我的 Laravel 5 应用程序中实现 twilio 要在我使用的框架中使用它aloha laravel twilio一体化 发送有效请求测试凭证工作正常 当我想要实施时遇到问题错误处理 由于某种原因 catch 没有收到错误 这会
  • 我应该使用 HTML::Parser 还是 XML::Parser 来提取和替换文本? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我希望能够提取所有纯文本并从 HTML XHTML 文档中分析 修改 然后根据需要进行替换 我可以使用以下方法来做到这一点吗HTML 解析器或者应该是XML 解析器 有没有人知道有什
  • 解释 Ruby on Rails 中的迭代器语法

    我开始学习 Ruby on Rails 发现自己对语法感到困惑 所以我必须阅读一些 Ruby 语法 我从中学到了语法http www cs auckland ac nz references ruby doc bundle Manual m
  • PyQt QThread 多线程不起作用

    I have 2 QListWidget lists List2 is being filled when some item has been selected from List1 问题是 在填充 List2 之前 我必须执行很多任务
  • 清除页面中的所有单选按钮

    我的应用程序中有很多动态生成的单选按钮Windows 窗体项目 可以根据数据库中的值来检查它们 我想通过单击按钮清除所有单选按钮 我怎样才能做到这一点 检查一下 private void button1 Click object sende
  • Visual Studio“任何 CPU”目标是什么意思?

    我对 Visual Studio 2008 中的 NET 平台构建选项有一些困惑 什么是 Any CPU 编译目标 它会生成什么类型 的文件 我检查了这个 任何 CPU 构建的输出可执行文件 发现它们是 x86 可执行文件 谁不会看到这一点
  • 通过需要考虑多种成本的矩阵的最佳路径

    例如给出以下矩阵 0 8 0 3 0 8 8 0 3 0 0 5 0 1 0 6 0 0 对于每个元组 第一个数字是食物 第二个数字是水 我需要从右下角到左上角 并且只能向上或向左移动 我需要收集尽可能多的食物和水 这样我才能活得尽可能长