【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]
}
相关推荐
仰泳的熊猫12 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码15 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发16 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre16 小时前
22 括号生成
算法·深度优先
努力也学不会java18 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎18 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan18 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业19 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe19 小时前
C++并发编程中的死锁避免
开发语言·c++·算法