algorithm - 二维房屋强盗算法

标签 algorithm data-structures dynamic-programming

这似乎是 LeetCode 盗屋问题的变体,但我发现它更难解决:

在 NxN 网格上布置了一些房屋。众所周知,每个房子都包含一定数量的贵重元素。强盗的任务是尽可能多地抢劫房屋,以最大限度地增加战利品的数量。然而,这里有一个安全系统,如果你抢劫两间相邻的房子(左边、右边、上面和下面),警报就会响起。找出强盗可以抢劫的最大战利品。

      Houses   :  alignment
     10 20 10      0  1  0
     20 40 20  =>  1  0  1
     10 20 10      0  1  0

   This alignment results in the maximum of 80.

我从 https://shanzi.gitbooks.io/algorithm-notes/problem_solutions/house_robber.html 学习了如何使用动态规划解决单排房屋的最佳选择问题:

public class HouseRobber {
    public int rob(int[] nums) {
        if (nums.length == 0) return 0;
        if (nums.length == 1) return nums[0];

        int[] dp = new int[nums.length];
        dp[0] = nums[0];

        int max = dp[0];
        for (int i = 1; i < dp.length; i++) {
            dp[i] = nums[i];
            // Do not need to check k < i - 3. 
            for (int j = 2; i - j >= 0 && j <= 3; j++) {
                dp[i] = Math.max(dp[i], dp[i - j] + nums[i]);
            }
            max = Math.max(dp[i], max);
        }

        return max;
    }
}

但是一旦我选择了一行的最佳选择,它可能与该行上方和下方各行的最佳选择不一致。即使我找到了两行的最佳组合,下一行可能比这两行的总和更有值(value),并且需要再次调整,等等。

这很困难,因为与单排房屋相比,要考虑的变量要多得多,而且还可能有不止一种最佳排列方式可以让强盗获得最大的战利品(如上例)。

我确实发现了一个用 Python 编写的似乎很糟糕的解决方案,但由于我只了解基于 C 的语言(Java、C#、C++),所以我无法从中获益。谁能帮我解决问题或至少提供一些建议?

感谢您的宝贵时间!

最佳答案

我浏览了 python你提到的代码。使用流程的解决方案对我来说看起来完全错误。没有从源到汇的路径具有有限的权重。该解决方案基本上像棋盘一样为网格着色,并选择所有黑色方 block 或所有白色方 block 。在以下情况下这不是最佳选择:

1     500
300   1
1000  300

最好选择 1000 和 500,但该解决方案将选择 300+300+500。

动态规划的解是指数级的。 我的数学知识不够,无法理解 LP 解决方案。

很抱歉没有回答您的问题。

关于algorithm - 二维房屋强盗算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50830647/

相关文章:

算法 - 动态规划 - 两个数组的子集和

algorithm - 为什么二分查找是一种分而治之的算法?

c# - System.Collections.Generic.Dictionary = 终极性能?

arrays - 平衡数组子区间中元素数量的算法?

java - 在网格中寻找最优路径

algorithm - n 阶梯的最大步数和

java - 算法:将 y 个球放入 x 个盒子中,其中 x <= y

c++ - 为什么此算法的这个 "improvement"不起作用?

algorithm - 在matlab中创建离散阶跃函数

java - 下面代码中的 sb2 如何保存 abc 而不是 abcd?