LeetCode每日一题 198. 打家劫舍

题目描述

给定一个代表每个房屋存放金额的非负整数数组 nums,计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。

解题思路

这是一个典型的动态规划问题。我们可以使用动态规划来解决。我们可以定义两个状态数组 f[i][0]f[i][1] 分别表示前 i 间房屋不偷窃和偷窃的最高金额。

状态转移方程如下:

  1. 如果我们不偷第 i 间房屋(即 i 间房屋不偷窃最高金额),那么它的值取决于前一间房屋是否偷窃。如果前一间房屋偷窃,则前 i 间房屋不偷窃最高金额等于前 i-1 间房屋偷窃最高金额,即 f[i][0] = f[i-1][1]
  2. 如果我们偷第 i 间房屋(即 i 间房屋偷窃最高金额),那么它的值取决于前一间房屋是否偷窃。如果前一间房屋不偷窃,则前 i 间房屋偷窃最高金额等于前 i-1 间房屋不偷窃最高金额加上当前房屋的价值,即 f[i][1] = f[i-1][0] + nums[i]

最后,我们返回前 n 间房屋的最高金额,其中 n 是房屋的总数。

代码实现

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) return nums[0];

        vector<vector<int>> f(n, vector<int>(2, 0));
        f[0][0] = 0;
        f[0][1] = nums[0];

        for (int i = 1; i < n; ++i) {
            f[i][0] = max(f[i-1][0], f[i-1][1]);
            f[i][1] = f[i-1][0] + nums[i];
        }

        return max(f[n-1][0], f[n-1][1]);
    }
};

你可能感兴趣的:(LeetCode每日一题,leetcode,代理模式,算法)