这似乎是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 ++),所以我无法从中获得更多。任何人都可以帮我解决方案或至少有一些指针吗?
谢谢你的时间!
答案 0 :(得分:0)
我查看了您提到的python代码。使用流程的解决方案对我来说显然是错误的。有限的重量没有从源到汇的路径。该解决方案基本上像棋盘一样为网格着色,并选择所有黑色方块或所有白色方块。在以下情况下,这不是最佳的:
1 500
300 1
1000 300
最好选择1000和500,但该解决方案将选择300 + 300 + 500。
动态编程解决方案是指数级的。 我不太了解数学,无法理解LP解决方案。
很抱歉不回答你的问题。