【问题标题】:minimum L sum in a mxn matrix - 2mxn 矩阵中的最小 L 和 - 2
【发布时间】:2010-12-23 13:38:07
【问题描述】:

这是我的first question 关于最大 L 总和,这是它的不同和硬版本。

问题:给定一个 mxn 整数矩阵,求从 第 1 行第 m 行。 L(4项)喜欢象棋马步

示例:M = 3x3

0 1 2

1 3 2

4 2 1

可能的 L 步是:(0 1 2 2), (0 1 3 2) (0 1 4 2) 我们应该从 1th 行到 3th 行,总和最小

我用动态编程解决了这个问题,这是我的算法:

1. 取一个 mxn 另一个 Minimum L Moves Sum 数组并复制主矩阵的第一行。我称之为 (MLMS) 2. 从第一个单元格开始,向上查找 L 移动并计算它
3. 如果小于存在值,则将其插入 MLMS
4. 执行第 2 步。直到第 m'th
5. 选择第 m'th 中的最小总和> 行

让我一步一步解释我的例子:

  1. M[ 0 ][ 0 ] sum(L1 = (0, 1, 2, 2)) = 5 ;总和(L2 =(0,1,3,2))= 6;所以 MLMS[ 0 ][ 1 ] = 6
    总和(L3 = (0, 1, 3, 2)) = 6;总和(L4 =(0,1,4,2))= 7;所以 MLMS[ 2 ][ 1 ] = 6

  2. M[ 0 ][ 1 ] sum(L5 = (1, 0, 1, 4)) = 6;总和(L6 =(1,3,2,4))= 10;所以 MLMS[ 2 ][ 2 ] = 6

    ... 最后一个 MSLS 是:
    0 1 2
    4 3 6
    6 6 6
    表示 6 是从 0 到 m 可以达到的最小 L 和。

我认为是 O(8*(m-1)n) = O(mn)。是否有适合此问题的最佳解决方案或动态规划算法?

谢谢,问了这么长的问题

【问题讨论】:

    标签: algorithm big-o dynamic-programming shortest-path


    【解决方案1】:

    矩阵中如何同时存在0-thm-th 行,总共有m 行?

    无论如何,一个简单的Dijkstra 将为您提供O(n*m) 中的最佳路径(假设您有一个良好的数据结构可以在尚未到达的点列表中找到最小值)。

    另外,如果你的马只能在棋盘上向下移动(有时向上移动以减少总路径权重很有用),你可以编写简单的 DP。只需从棋盘底部开始,为每个位置计算到达底部所需的时间。由于您可以从每个位置最多进行 4 次移动,因此这是一个简单的最小值检查。像这样的

    for (int row = m - 1; row >= 0; --row) {
        for (int col = 0; col < m; ++col) {
            int path1 = a[row][col + 1] + a[row][col + 2] + a[row + 1][col + 2] + best[row + 1][col + 2];
            int path2 = a[row][col + 1] + a[row + 1][col + 1] + a[row + 2][col + 1] + best[row + 2][col + 1];
            int path3 = ...
            int path4 = ...
            best[row][col] = min(path1, path2, path3, path4);
        }
    }
    

    编辑
    为什么需要上去?想象一下这样的矩阵(其中* 表示一些非常大的数字,例如 1000000000)。显然,你必须先从(0, 0) 走到棋盘的右侧,然后才能下楼。

    111111111111
    111111111111
    *********111
    *********111
    

    所以,路径将如下所示

    ...1...1...1
    11...1...1..
    *********11.
    *********11.
    

    【讨论】:

    • 当然我的意思是 1 - m'th 或 0th - (m-1)'th 。我现在正在编辑
    • 你可以上去,但为什么要这样做呢?因为所有的数字都是正数
    • 如果数字都是正数,您可以找到解决方案,否则问题无法解决。例如,想象一下从 A 开始有 2 次移动并返回到 A(即循环),总和为负。最好的解决方案是无限地利用该循环来减少路径权重到 -INF...
    • 您不一定要从 0,0 移动。问题是从第一行(在任何列中)到最后一行(在任何列中),那么您的示例不正确。无论如何,你可能需要上升。我会举个例子,但不可能在评论中......(最后一句话闻起来像费马......)
    • @digEmAll 是的,我错过了“第一行”部分。无论如何,正如你所说,纠正这个例子很容易。
    猜你喜欢
    • 2011-05-28
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多