【Golang】LeetCode198. 打家劫舍

198. 打家劫舍

题目描述

思路

"打家劫舍"是一个经典的模板题,指的就是在动态规划问题当中,在统计答案的过程中,不能选择相邻的元素 。比如,如果我们将0位置的元素放进了背包当中,那么就不能放1位置的元素了;反之,如果我们将1位置的元素放进了背包内,就意味着0位置的元素一定没有放进背包内,同时2位置的元素不能放进背包内。题目要求我们最终统计的按照"打家劫舍"的规则,能够放进背包当中的物品的最高价值。

我们使用动态规划来解决这个问题,初始化一个长度为n的数组,名为dp,使用它来记录每一个位置按照上述规则可以获得的最高金额。我们首先来分析n == 0n == 1n == 2的特例,显然在第0个位置,金额就是0;在n == 1时,只能取nums[0]位置的元素放进背包内,此时最高价值就是nums[0];而在n == 2时,就需要判断nums[0]nums[1]哪个元素的价值更高,max(nums[0], nums[1])就是dp[2]的答案。

基于上述分析,我们可以推导出dp的状态转移方程,那就是dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])。转换成自然语言其实也很好理解,对于n == i的位置,该位置能够获得的最大价值要么就是dp[i - 1]的最大价值,此时不能够取n == i位置的元素,否则不满足"不能取相邻位置的元素"的题目约束;要么就是取nums[i]位置的元素,同时累加dp[i - 2]位置的价值。

Golang 题解

go 复制代码
func rob(nums []int) int {
    n := len(nums)
    if n == 1 {
        return nums[0]
    } else if n == 2 {
        return max(nums[0], nums[1])
    }

    dp := make([]int, n + 1)
    dp[1], dp[2] = nums[0], max(nums[0], nums[1])
    
    for i := 3; i <= n; i ++ {
        dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1])
    }

    return dp[n]
}
相关推荐
To_OC11 分钟前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
delishcomcn1 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹1 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
雪碧聊技术2 小时前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划
CV-Climber4 小时前
检索技术的实际应用
人工智能·算法
hhzz5 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
从零开始的代码生活_6 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
TsingtaoAI6 小时前
3D高斯泼溅技术发展及其在具身智能领域的应用综述
人工智能·算法·ai·具身智能·高斯泼溅
atunet6 小时前
关于图算法中的连通分量检测与最小割问题7
算法