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