题目描述:具体描述见原题,简单来说就是按照一定规则获取数组内元素之和最大值。
解题思路:使用dp,其中状态转移方程是dp[i]=max(dp[i-1], dp[i-2]+nums[i])。其中dp[i]代表下标[0,i]范围内,可按照指定规则获取元素最大值之和。具体过程见代码。
具体代码:
func rob(nums []int) int {
if len(nums) == 0 { // 边界条件
return 0
}
if len(nums) == 1 { // 边界条件
return nums[0]
}
res := make([]int, len(nums)) // 初始化dp数组,默认dp[i]均初始化为0
res[0], res[1] = nums[0], max(nums[0], nums[1]) // dp[0]为nums[0],dp[1]为max(nums[0], nums[1])
for i := 2; i < len(nums); i++ {
res[i] = max(res[i-1], res[i-2]+nums[i]) // 利用状态转移方程更新dp数组
}
return res[len(nums)-1]
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
补充说明:这也是一道简单动态规划。明天开始休去年年假,先去探索探索小酒馆。