这是一个典型的动态规划问题。假设 dp[i] 表示偷取前 i 个房屋能够获得的最高金额。对于第 i 个房屋,有两种选择:

  1. 偷取第 i 个房屋,则前一个房屋(第 i-1 个房屋)不能偷取,所以偷取前 i 个房屋能够获得的最高金额是 dp[i-2] + nums[i]
  2. 不偷取第 i 个房屋,则偷取前 i 个房屋能够获得的最高金额是 dp[i-1]

因此,可以得到状态转移方程:

dp[i] = max(dp[i-2] + nums[i], dp[i-1])

边界条件为:

dp[0] = nums[0] dp[1] = max(nums[0], nums[1])

最终,结果就是 dp[nums.size()-1]

下面是使用 C++11 实现的代码:

#include <vector>
#include <algorithm>

int rob(vector<int>& nums) {
    int n = nums.size();
    if (n == 0) return 0;
    if (n == 1) return nums[0];
    
    vector<int> dp(n, 0);
    dp[0] = nums[0];
    dp[1] = max(nums[0], nums[1]);
    
    for (int i = 2; i < n; i++) {
        dp[i] = max(dp[i-2] + nums[i], dp[i-1]);
    }
    
    return dp[n-1];
}

通过以上代码,就可以计算出不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。

C++11 算法:专业小偷的最佳偷窃路线

原文地址: https://www.cveoy.top/t/topic/cqZP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录