算法 198. 打家劫舍 ---------动态规划学习

题目: https://leetcode.cn/problems/house-robber

看到"最高金额" 立即知道求最值一般使用动态规划,这是很经典的动态规划。

dp[i] 数组的意思是 以 i 结尾的数组可以得到的最高金额,此时小偷可以选择偷 nums[i] 也可以选择不偷,怎么样可以得到 dp[i] 值呢?要么是 dp[i-2],要么是 dp[i-1],其实小偷还可以选择dp[i-3],dp[i-4]....一直到 dp[0],但是选择dp[i-3],dp[i-4]...这些数字很明显不可能比 dp[i-1]和 dp[i-2] 中的更大,因为 dp[i-1] 和 dp[i-2] 就是从 dp[i-3],dp[i-4],dp[i-5]......中得来的。

所以在 nums[i] 位置处的 dp[i] 要想最大,只可能是 max(dp[i-2]+nums[i], dp[i-1]) 。其中边界情况和起始条件是,如果nums 数值只有一个值,那就直接返回它,如果有两个值,就返回两者中最大的那个。

Go 复制代码
func rob(nums []int) int {
	var res int
	if len(nums) == 0 {
		return 0
	}
	if len(nums) == 1 {
		res = nums[0]
		return res
	}
	dp := make([]int, len(nums))
	dp[0] = nums[0]
	dp[1] = max(nums[0], nums[1])
	for i := 2; i < len(nums); i++ {
		dp[i] = max(dp[i-2]+nums[i], dp[i-1])
		res = max(res, dp[i])
	}
	return dp[len(nums)-1]
}

213. 打家劫舍 II

https://leetcode.cn/problems/house-robber-ii

这个问题对上面的问题加了限制,即比较nums[0,len(nums)-1] 和 nums[1:len(nums)] 的能偷到的最大值。

Go 复制代码
func rob(nums []int) int {
	if len(nums) == 0 {
		return 0
	}
	if len(nums) == 1 {
		return nums[0]
	}
	return max(rob2(nums[0:len(nums)-1]), rob2(nums[1:len(nums)]))
}
func rob2(nums []int) int {
	var res int
	n := len(nums)
	if n == 0 {
		return 0
	}
	if n == 1 {
		res = nums[0]
		return res
	}
	dp := make([]int, n)
	dp[0] = nums[0]
	dp[1] = max(nums[0], nums[1])
	for i := 2; i < n; i++ {
		dp[i] = max(dp[i-2]+nums[i], dp[i-1])
		res = max(res, dp[i])
	}
	return dp[n-1]
}
相关推荐
2401_8318249623 分钟前
基于C++的区块链实现
开发语言·c++·算法
We་ct31 分钟前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
愣头不青34 分钟前
238.除了自身以外数组的乘积
数据结构·算法
人工智能AI酱1 小时前
【AI深究】逻辑回归(Logistic Regression)全网最详细全流程详解与案例(附大量Python代码演示)| 数学原理、案例流程、代码演示及结果解读 | 决策边界、正则化、优缺点及工程建议
人工智能·python·算法·机器学习·ai·逻辑回归·正则化
WangLanguager1 小时前
逻辑回归(Logistic Regression)的详细介绍及Python代码示例
python·算法·逻辑回归
m0_518019481 小时前
C++与机器学习框架
开发语言·c++·算法
一段佳话^cyx1 小时前
详解逻辑回归(Logistic Regression):原理、推导、实现与实战
大数据·算法·机器学习·逻辑回归
qq_417695051 小时前
C++中的代理模式高级应用
开发语言·c++·算法
xiaoye-duck2 小时前
《算法题讲解指南:动态规划算法--路径问题》--5.不同路径,6.不同路径II
c++·算法·动态规划
ambition202422 小时前
最大子数组和算法全解析:从暴力枚举到动态规划优化
数据结构·c++·算法