- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是我算法课上的,我想我真的需要一些帮助。
给定一个成本矩阵Happiness[][],其中Happiness[i][j]表示使用坐标(i,j)访问单元格的幸福,则从右上角开始,到左下角结束我们想找到最大的幸福。
在矩阵中只能向下或向左。
但我们有两个限制:
1.您可以选择跳过零行或多行,这意味着您可以根据需要首先转到最后一行。
2.选择向左时,成本=成本-1。第二个连续的左键导致cost=cost-2,但是当您向下然后向左键时,它会刷新。
下面是一个例子:
这是步骤:
我不确定我是对是错。我用自上而下的。
我的解决方案:
要达到一个单元格矩阵[i][j],您必须从一个更高的单元格或左到原始单元格。
我的复发:(我卡在这里)
我认为基本情况是最左边的行和最下面的列。
计算机如何检查连续步骤并知道是opt解决方案?
我知道把整个问题贴出来很奇怪,但我不能把问题简化得更好。。。
最佳答案
根据@____的评论,解决这个问题的诀窍是添加一个额外的维度,表示到达递归关系的单元格所用的左数。
注意:为了简化这个问题,我将给定矩阵的行颠倒,使允许的移动方向为向下和向右,起始单元格变为(0, 0)
而结束单元格变为(W - 1, H - 1)
,其中W
和H
分别是矩阵的宽度和高度。此外,矩阵和相应的最大幸福度dp表被认为是按行的主要顺序排列的,即matrix[y][x]
是单元格(x, y)
处的值。
我们真正的基本情况是访问起始单元的快乐,它要么matrix[0][0]
要么0
,这取决于起始单元的值是否必须包含在总快乐中。但是,我们也有两个伪基的情况比较简单的计算实际递归。
这些伪基本情况是最左边的列(记住,行已经反转,所以这是原始矩阵中最右边的列)和最上面的行最左边列中单元格(0, y)
(1 <= y < H
)的递归关系为:
h[y][0][0] = matrix[y][0] + max(h[i][0][0] for i in 0 to y-1)
h
是我们的最大幸福度dp表,
h[y][x][r]
是在到达
(0, 0)
之前,从单元格
(x, y)
到
r
的最大幸福度(遵循给定的规则),取了
(x, y)
个连续的右(或左,对于原始的非行反转矩阵)因此,如果
r
为0,则最后遍历的单元格是当前单元格正上方的单元格到达最左边列中单元格的唯一可能方法是直接从它上面的单元格中获取。
(x, y)
的最大幸福是由
h[y][x][r]
的最大值赋予
r
的所有值。如果
h
是三维数组/列表,它也可以表示为
max(h[y][x])
。
(x, 0)
(
1 <= x < W
)的递归关系是:
h[0][x][x] = h[0][x-1][x-1] + matrix[0][x] - x
-x
的惩罚。
(x, y)
的复发关系,其中
1 <= x < W
和
1 <= y < H
。
(x, j)
,其中
0 <= j < y
为了获得最大的幸福,最后一间牢房的幸福也必须是最大的。因此,当最后一个单元格位于给定单元格之上时,
(x, y)
的最大幸福是由
h[y][x][0] = matrix[y][x] + max(max(h[j][x]) for j in 0 to y-1)
r
)是0,而
max(h[j][x])
是以任意权限到达细胞
(x, j)
所获得的最大幸福。
(x - 1, y)
。这是因为我们一次只能向右移动一个单元格。与前一种情况不同,最后一个单元格的位置是恒定的。但是,访问此单元格所需的连续权限(
r
)数目是可变的因此,我们必须考虑
r
的所有可能值。由于最小的1个权利和最大的
x
权利可以作出,
1 <= r <= x
。对于
r
的每一个值,这个单元格的最大幸福度是对[cc]权利的左边(最后一个单元格)的最大幸福值加上
r - 1
减去惩罚值(这只是
(x, y)
)。在伪代码中,
for r in 1 to x:
h[y][x][r] = h[y][x-1][r-1] + matrix[y][x] - r
r - 1
算法:
h[0][0][0] = matrix[0][0]
for x in range(1, W):
h[0][x][x] = h[0][x-1][x-1] + matrix[0][x] - x
for y in range(1, H):
h[y][0][0] = matrix[y][0] + max(h[i][0][0] for i in range(y))
for y in range(1, H):
for x in range(1, W):
for r in range(1, x + 1):
h[y][x][r] = h[y][x-1][r-1] + matrix[y][x] - r
h[y][x][0] = matrix[y][x] + max(max(h[j][x]) for j in range(y))
return max(h[H-1][W-1])
max(h[H-1][W-1])
的
O(W^2 * H^2)
运算,使最后的时间复杂度
O(W)
。请注意,此优化仅对自底向上方法有效这是因为单元格
max(h[j][x])
(其中
O(W * H^2)
)应该已经用自底向上的方法访问过了在下面的代码中,
(x, j)
存储在
j < y
中。
matrix = [[5, -2, -1, 5, 3, -99, 4, 0],
[5, -2, -1, -3, 3, -99, 2, -3],
[-98, -98, -98, -98, -98, -98, -98, -98],
[-99, -99, -99, -99, -99, -99, -99, -99],
[5, 0, -3, 5, -1, 7, -2, 2],
[1, 2, 7, 0, 0, 1, -1, -1]]
H = len(matrix)
W = len(matrix[0])
for row in matrix:
row.reverse()
h = [[[0] * (W + 1) for i in range(W)] for j in range(H)]
h[0][0][0] = matrix[0][0]
h[0][0][W] = h[0][0][0]
for x in range(1, W):
h[0][x][x] = h[0][x-1][x-1] + matrix[0][x] - x
h[0][x][W] = h[0][x][x]
for y in range(1, H):
h[y][0][0] = matrix[y][0] + max(h[i][0][0] for i in range(y))
h[y][0][W] = h[y][0][0]
for y in range(1, H):
for x in range(1, W):
h[y][x][0] = matrix[y][x] + max(h[j][x][W] for j in range(y))
h[y][x][W] = h[y][x][0]
for r in range(1, x + 1):
h[y][x][r] = h[y][x-1][r-1] + matrix[y][x] - r
h[y][x][W] = max(h[y][x][W], h[y][x][r])
print(h[H-1][W-1][W])
关于algorithm - 动态编程:通过二维矩阵的总和(较硬的版本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50264132/
算力时代,视频云需要怎样的 CPU? 在数据爆发式增长及算法日益精进的大背景下,属于「算力」的时代俨然到来。随着视频成为互联网流量的主角,日趋饱和的音视频场景渗透率、人类对“感官之限”的追
我正在使用 keras 开发深度网络。有一个激活“硬 sigmoid”。它的数学定义是什么? 我知道什么是 Sigmoid。有人在Quora上问了类似的问题:https://www.quora.com
我有一个不寻常的 SQL 问题,我不太确定如何最好地解释,所以请耐心等待。我有三张表,一张是志愿者组织的表,一张是用户的表,一张是用户详细信息的表。 #Table 1# ## Name Preside
我正在尝试使用名为 bigText 的 jquery 插件。一个很棒的用于创建 block 头的插件。如果您想将其与自定义字体一起使用,它会声明您需要 google webfont loader,这样
假设我有一张 table date,personid 1/1/2001 1 1/2/2001 3 1/3/2001 2 1/4/2001 2 1/5/2001 5 1/6/2001 5 1/7/200
下面是我要执行的 SQL。我想避免为此执行多个请求,我很确定这是可能的…… First table : products_categories (category_id, category_infos
我在 android studio 中重新设置了一些提交,并选择了硬重置类型。我失去了一个星期的工作。是否有希望撤销此操作?我正在使用 android studio,它有内置的 GUI 选项来执行所有
当我使用我的交叉工具链编译 C 代码时,链接器会打印出警告页面,说明我的可执行文件使用了硬 float ,但我的 libc 使用了软 float 。有什么区别? 最佳答案 硬浮点使用片上浮点单元。软
linux系统有arm64,arm架构armv8-a。如何知道 debian 是运行硬浮点还是软浮点? 最佳答案 符合 AAPCS64, GNU GCC for armv8 仅提供硬浮点 aarch6
我正在开发 cortex-m3 的微内核。我创建了一个故意导致错误的小型测试应用程序。 现在我不确定如何从故障中返回。我知道堆栈可能需要使用不同函数的地址进行更新。我也知道在某些情况下从错误返回可能是
硬/软 限制是什么意思? 核心文件大小的差异例如: ulimit -Sc 1024 与 ulimit -Hc 1024 我通常在运行二进制文件之前将脚本放入 ulimit -c unlimited。
我想在 Java 中加载一个 MSCAPI keystore 并检查 MY 存储中的可用证书。但是,这些证书的一些 key 驻留在硬件 token 上,并且弹出窗口会在加载期间询问 token 。 有
是的,这是一个有点棘手的问题; 一个数组(没有副本),而不是任何奇数数组。让我解释一下,让我们从这里开始; $a = array ( 'one' => 1, 'two' => 2, 'three' =
我需要在运行 Ubuntu 12.04 的 BeagleBoard xM rev C 上运行一个使用 ftd2xx 的程序。我正在尝试使用提供的 ARM 库 libftd2xx.so here . l
我是一名优秀的程序员,十分优秀!