Title

(线性dp)LeetCode. 打家劫舍

(线性dp)LeetCode198.打家劫舍1

思路

主要问题是这一家到底抢不抢,有两种状态,那么就可以设置一个二维\(dp\)数组

\(dp[i][0/1]\)\(i\)家第\(i\)家抢(不抢)能够获得的最大值

  1. 如果抢的话: \(dp[i][1] = dp[i - 1][0] + nums[i]\)

  2. 如果不抢的话:\(dp[i][0] = max(dp[i - 1][0], dp[i - 1][1])\)

代码

int ans[110][3] = {0};
int rob(vector<int>& nums) 
{
    int len = nums.size();
    ans[0][1] = nums[0];
    for (int i = 1; i < len; i++)
    {
        ans[i][0] = max(ans[i - 1][0], ans[i - 1][1]);
        ans[i][1] = ans[i - 1][0] + nums[i];
    }
    return max(ans[len - 1][0], ans[len - 1][1]);
}

(线性dp) LeetCode213. 打家劫舍2

思路

多出来两种情况,第一个选不选,分别讨论就好了

代码

int rob(vector<int>& nums) 
{
    int len = nums.size();
    if (len == 1) return nums[0];
    if (len == 2) return max(nums[0], nums[1]);
    // 第一个不选时;
    int dp1[110][2] = {0};
    int dp2[110][2] = {0};
    dp1[1][1] = nums[1];
    for (int i = 2; i < len; i++)
    {
        dp1[i][0] = max(dp1[i - 1][0], dp1[i - 1][1]);
        dp1[i][1] = dp1[i - 1][0] + nums[i];
    }
    int ans1 = max(dp1[len - 1][1], dp1[len - 1][0]);
    // 第一个选的时候
    dp2[0][1] = nums[0];
    for (int i = 1; i < len - 1; i++)
    {
        dp2[i][0] = max(dp2[i - 1][0], dp2[i - 1][1]);
        dp2[i][1] = dp2[i - 1][0] + nums[i];
    }
    int ans2 = max(dp2[len - 2][1], dp2[len - 2][0]);
    return max(ans1, ans2);
}
posted @ 2024-10-02 21:19  栗悟饭与龟功気波  阅读(11)  评论(0)    收藏  举报