- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
任务定义:
我有一个自然数矩阵。任务是找到从矩阵左上角到矩阵右下角的路径并拨出最大分数。导航规则:如果您位于 [i][j],您可以移动:a) 到 [i][j-1], [i][j+1], [i+1][j] 个单元格并拨零点b) 向[i+1][j+1]拨矩阵[i][j]点
小例子:
假设您有50分
和矩阵
0 3 5 3 2
4 7 2 5 2
4 3 5 2 5
假设您在 [1][1] 个单元格中(矩阵 [1][1] = 7)。您可以导航到:
a) [1][0] cell with 50 score
b) [1][2] cell with 50 score
c) [2][1] cell with 50 score
d) [2][2] cell with 57 score
什么问题:
我以非常缓慢的方式解决这个任务...
我尝试在递归的帮助下实现。如果您只想找到最高分,这很容易。有点像
public int loop(int i, int j) {
int left = loop(i, j-1);
int top = loop(i-1, j);
int diagonal = loop(i-1,j-1) + matrix[i-1][j-1];
return maximum(left, top, diagonal);
}
但是,我想找到得分最高的路径!而且它非常耗时/内存。
为什么会耗费时间/内存:
还有一个问题:我需要存储路径集合并将其作为参数传递给循环方法。但是循环方法在每次迭代时 fork ,我必须在迭代时复制路径集合。否则,每个循环分支都会修改公共(public)路径集合,最后我将在其中包含所有可能的路径。我的意思是,如果在 left
、top
和 diagonal
之间,最大的是 left
,我们不能包含链接的路径顶部
和对角线
。
问题:
如何正确解决?
编辑:
其实不需要找全路径。它只需要找到你拨分数的点(你在其中进行对角线移动)
最佳答案
为此您不需要动态规划或暴力破解!
要了解原因,让我们分析一下规则:
j
方向上自由移动(左和右),因此没有理由要小心那个方向 - 您可以随时移动到最佳水平位置。i
(向下)就没有回头路了(尽管您可以增加i
而不会获得分数)。 i
的每次增加都应该获得最大的点数。j
位置,然后对角线走一步;重复直到完成。i
步骤是从具有最高值的行中的非最后一个单元格开始移动。您不能从最后一个单元格移动,因为不可能进行对角线移动 - 因此,如果您的矩阵只有一列(或一行),您将永远不会获得积分。您不会失分,因为这些值是自然数(但如果允许负数,您仍然可以跳过一行)。更详细地说,然后通过...找到最佳路径
就是这样!
请注意,可能存在多个最大路径,您的问题说明并不能保证唯一的解决方案。
编辑:如果您不需要实际路径,而只需要您得分的数字,则该算法会简单得多 - 删除或忽略最后一行和最后一列,然后对于每个 i
(行)返回该行中的最大值。
关于algorithm - 有趣的谜题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19670265/
这个问题在这里已经有了答案: With arrays, why is it the case that a[5] == 5[a]? (20 个答案) 关闭 7 年前。 我正在尝试解开这个谜团: in
很难为这个问题找到合适的标题。欢迎编辑! :) 这是我的来源xml代码: [color hex] [color hex] [color he
编辑:看起来像一个索引问题,在问题底部更新 我有以下查询 + 子查询,其结果我无法解释。我从这个最小的输入数据集开始(这里的应用程序正在捕获数据变化,PK 是 id + tx_id)。 mysql>
基本上,我在这里试图实现的是让全局变量具有指向结构的指针数组,其大小在编译时是未知的——在我下面的示例中,它是 my_struct **tab。在最终版本中,我想调用一个 JNI 方法来初始化我的指针
所以我想弄清楚这个谜题: function fun1(){ var result = []; for (var i = 0; i < 5; i++){ result.p
一群 child 围成一圈。选择第一个 child ,他们从那个 child 开始顺时针计数,直到达到固定数字(n,在游戏开始时给出)。当计数达到 n 时,第 n 个位置的 child 被淘汰。游戏从
(我是 JS 新手,所以请耐心等待)我正在使用 table 来构建滑动益智游戏。我需要一个可以扰乱值的函数,但我不确定应该如何让它显示在表格单元格中。现在我的代码只是按顺序显示数字。 我有两个函数 -
我有一个 UserForm,xForm,它在类模块(假设为 TestClass)中实例化为: 'TestClass Dim Form as New xForm Private WithEvents E
如果没有循环或游标,如何获取日期间隔列表并将它们转换为 1 和 0 的字符串,这样: 每一位代表从 min(所有日期)到 max(所有日期)的每一天 如果该天属于任何日期间隔,则该位为 1 如果该天不
我读过很多A*算法的伪代码,但它们都没有真正解释如何输出解。我相信我理解使用优先级队列表示尚未访问的内容和使用已探索的表的概念,但是当我执行该算法时,我不知道在什么时候打印出结果。有没有人有一个伪代码
以下两个查询不会返回相同的结果。为什么? 注意 :我发现这个问题是一个 Mysql 难题,我没有关于这个问题的更多数据? SELECT table1.* FROM table1 LEFT JOIN t
如果您对我应该如何在 python 中执行以下任务有任何建议,我正在徘徊:假设我有以下类(class): class A(object): self._classes = [] def
我很难理解如何在不引起内存分配问题的情况下解决这个问题。我很确定我的逻辑是合理的,但不幸的是,这似乎还不够好。有没有人对此有任何建议,以便我了解如何更有效地编写代码? 问题来了:示例输入:1个5 2
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
所以这是一个难题: “kb”是扩展 java.util.Hashtable 的类的实例键是一个字符串,存储的值是一个名为“IntelCard”的类 此代码提取 key ,并尝试从表中打印数据
我有以下难题要解决,但我不确定我该怎么做。它说: 有一个 Ubuntu Linux C 程序可以输出变量的地址。 v1: 0xa156128 v2: 0xff97410c v3: 0xf750e34b
我有一个简单的 HTML 页面如下:- Col1 Col2
大家好, 我尝试了八个难题的解决方案发布 here由 joel Neely 玩弄并修改它,以便可以用来解决更高的网格[将网格的字符串表示更改为二维整数表示并修改相应的逻辑]。然而,修改后的代码可以解决
我正在尝试解决下文详述的 projecteuler 难题。我当前的函数适用于数字 1 到 10,但是当我尝试 1 到 20 时,它会一直循环下去而没有结果。 2520 is the smallest
我在为基于图 block 的游戏编写随机关卡生成器时遇到了一个有趣的问题。我已经为它实现了一个强力求解器,但它的速度呈指数级下降,而且绝对不适合我的用例。我不一定要寻找完美的解决方案,我会对性能良好的
我是一名优秀的程序员,十分优秀!