198. 打家劫舍(leetcode)

题目描述

题目链接:198. 打家劫舍(leetcode)
主要就是求数组和的最大值,要求每个数组的值不能相邻。
示例 :

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

解题思路

动态规划。分析这个问题可由两部分组成,偷前k-1间房子,最后一间不偷;偷前k-2间房子和最后一间。
因此,状态转移方程为:
在这里插入图片描述
还要注意:在写递推关系的时候,要注意写上 k=0和 k=1的基本情况:
当 k=0 时,没有房子,所以 f(0) = 0。
当 k=1时,只有一个房子,偷这个房子即可,所以 f(1) = H0

代码

int rob(vector<int>& nums) {
    if (nums.size() == 0) {
        return 0;
    }
    int N = nums.size();
    vector<int> dp(N+1, 0);
    dp[0] = 0;
    dp[1] = nums[0];
    for (int k = 2; k <= N; k++) {
        dp[k] = max(dp[k-1], nums[k-1] + dp[k-2]);
    }
    return dp[N];
}
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页