2D House Robber算法

时间:2018-06-13 06:44:39

标签: algorithm data-structures dynamic-programming

这似乎是LeetCode House Robber问题的一个变种,但我发现它更难解决:

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;
    }
}

但是,一旦我选择了一行的最佳选择,它可能与该行上方和下方的行的最佳选择不一致。即使我找到两行的最佳组合,下一行可能比两行合并更多的贵重物品,并且需要进行另一次调整,并且开启和开启。

这很困难,因为要考虑的变量比单行的房屋要多得多,并且还可能有多个最佳路线给强盗最大的战利品(例如上面的例子)。

我确实在Python中发现了一个写得不好的解决方案,但由于我只理解基于C语言(Java,C#,C ++),所以我无法从中获得更多。任何人都可以帮我解决方案或至少有一些指针吗?

谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

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

1     500
300   1
1000  300

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

动态编程解决方案是指数级的。 我不太了解数学,无法理解LP解决方案。

很抱歉不回答你的问题。