【发布时间】:2017-08-08 16:20:10
【问题描述】:
考虑以下问题:
给定一个无符号整数的二维数组和最大长度 n,在该矩阵中找到一个不超过 n 的 路径 并且使总和最大化。输出应包含路径和总和。
路径由相邻的整数组成,这些整数要么都在同一行,要么在同一列,要么在右下方向的对角线上。
例如,考虑以下矩阵和给定路径长度限制3:
1 2 3 4 5
2 1 2 2 1
3 4 5* 6 5
3 3 5 10* 5
1 2 5 7 15*
最佳路径是5 + 10 + 15(节点标有*)。
现在,在看到这个问题时,动态编程解决方案似乎是最合适的,因为这个问题与Min Cost Path 或Maximum Sum Rectangular Submatrix 等其他问题相似。问题在于,为了正确解决这个问题,您需要从矩阵中的每个整数(节点)开始构建路径,而不仅仅是从左上角开始到右下角结束。
我最初正在考虑一种类似于Maximum Sum Rectangular Submatrix 解决方案的方法,其中我可以存储来自每个节点的每个可能路径(路径长度小于n,只会向右/ down),但我能想到的唯一方法是从每个节点递归调用 down 和 right,这似乎违背了 DP 的目的。另外,我需要能够存储最大路径。
我正在考虑的另一个可能的解决方案是以某种方式调整最长路径搜索并从图中的每个 int 运行它,其中每个 int 就像一个边权重。
找到最大路径的最有效方法是什么?
【问题讨论】:
-
你能解释一下这个例子吗? 10 和 15 不是邻居,那么
10 + 15怎么会在路径中呢?另外,您说路径可以从 任何 int 到任何其他 int,那么您的示例中的那些 int 是什么——它们是给定的,还是应该是输出的一部分?这些整数是由值还是由(行、列)索引给出的? -
你写“通过向下或向右”,但提出的解决方案有一个对角线台阶。那么您的意思是“向下,向右,或对角线向下”?
-
矩阵可以有负数吗?
-
@trincot 是的,我的意思是向下,或向右,或对角线向下,而且矩阵不能有负数
-
@trincot 实际上,我似乎误读了这个问题。约束是路径只能选择同一行、同一列或对角线下方的整数。
标签: arrays algorithm recursion dynamic-programming