LeetCode 动态规划训练:198. 打家劫舍

题目大意

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

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

输入

给出每间屋子的价值。(给定 \(vector\) 容器 \(nums\)

数据范围

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

思路

很明显,这题具有最优子结构。所以考虑动态规划。

\(dp_i\)“偷完第 \(i\) 个房间后的最大代价”

假设小偷是按编号偷窃,那么对于房间 \(i\)\(dp_i = max\{dp_j+cost_{j-1}\}+cost_{i-1}\) ,其中 \(1 \leq j \leq i-2\)

而最终目标就是所有最大代价的最大值,即 \(max\{dp_i\}\)

\(n\) 为房间数,则时间复杂度为 \(O(n^2)\) ,因为 \(n\) 的数据范围很小(1 <= nums.length <= 100),所以可以通过。

代码示例

这里使用 LeetCode 的代码,而不是包含主函数的常规代码。

class Solution {
public:
    const int N=110;
    int rob(vector<int>& nums) {
        int n=nums.size();
        int dp[N];
        for(int i=1;i<=n;i++)
            dp[i]=nums[i-1];
        for(int i=3;i<=n;i++)
            for(int j=i-2;j;j--)
                dp[i]=max(dp[i],dp[j]+nums[i-1]);
        int ans=0;
        for(int i=1;i<=n;i++)
            ans=max(ans,dp[i]);
        return ans;
    }
};
posted @ 2026-05-10 08:31  naijil  阅读(15)  评论(0)    收藏  举报