House Robber变化:最多可以抢K家
House Robber variation: can rob at most K house
如果我们添加新的约束条件,如何解决著名的 House Robber 问题:强盗总共最多可以抢劫 k 所房子?
问题描述:你是一名职业强盗,打算沿街抢劫房屋。每间房子都藏有一定数量的钱,阻止你抢劫每间房子的唯一限制是相邻的房子有连接的安全系统,如果两个相邻的房子在同一晚被闯入,它会自动联系警察。
给定一个整数数组 nums 代表每个房子的金额,return今晚你可以在不报警的情况下抢劫的最大金额。
示例 1:
输入:nums = [1,2,3,1]
输出:4
解释:抢劫 1 号房子(金钱 = 1),然后抢劫 3 号房子(金钱 = 3)。
您可以抢劫的总数 = 1 + 3 = 4.
原来的问题可以用Dynamic Programming按照递推公式求解:
D(i) = max{ D(i-2) + value[i] , D(i-1) }
^ ^
rob house i don't rob house i
通过为您可以抢劫的最大房屋数量添加一个额外的维度,您可以轻松修改解决方案:
D(i, k) = max { D(i-2, k-1) + value[i], D(i-1, k) }
当然,当k < 0
时需要添加一个停止子句
然而,额外的维度将增加时间复杂度k
。
如果我们添加新的约束条件,如何解决著名的 House Robber 问题:强盗总共最多可以抢劫 k 所房子?
问题描述:你是一名职业强盗,打算沿街抢劫房屋。每间房子都藏有一定数量的钱,阻止你抢劫每间房子的唯一限制是相邻的房子有连接的安全系统,如果两个相邻的房子在同一晚被闯入,它会自动联系警察。
给定一个整数数组 nums 代表每个房子的金额,return今晚你可以在不报警的情况下抢劫的最大金额。
示例 1:
输入:nums = [1,2,3,1] 输出:4 解释:抢劫 1 号房子(金钱 = 1),然后抢劫 3 号房子(金钱 = 3)。 您可以抢劫的总数 = 1 + 3 = 4.
原来的问题可以用Dynamic Programming按照递推公式求解:
D(i) = max{ D(i-2) + value[i] , D(i-1) }
^ ^
rob house i don't rob house i
通过为您可以抢劫的最大房屋数量添加一个额外的维度,您可以轻松修改解决方案:
D(i, k) = max { D(i-2, k-1) + value[i], D(i-1, k) }
当然,当k < 0
然而,额外的维度将增加时间复杂度k
。