题目描述:
题解:动态规划
题目三种情况:
1.输入nums只有一个元素,直接返回nums[0]
2.输入nums有两个元素,直接返回两个元素中的最大值。
当nums中元素数量大于三采用动态规划的方法:
创建数组maxaccount,maxamount[i]表示偷窃位置i,在nums[0:i]中可以获取的最大值,即maxamount[i]=max(nums[i]+maxamount[i-2],nums[i]+maxamount[i-3])
class Solution(object): def rob(self, nums): if len(nums)==1: return nums[0] if len(nums)==2: return max(nums[1],nums[0]) n = len(nums) maxamount = [0 for i in range(n)] maxamount[0] = nums[0] maxamount[1] = nums[1] maxamount[2] = nums[0]+nums[2] for i in range(3,n): maxamount[i] = max(nums[i]+maxamount[i-2],nums[i]+maxamount[i-3]) return max(maxamount)
题解二:改进版
将dp初始化为一个大小为len(nums)+1的数组,dp[len(nums)]=0 dp[len(nums)-1]=nums[len(nums)-1]
dp[i]=max(dp[i+1],dp[i+2]+nums[i])
class Solution(object): def rob(self, nums): number = len(nums) dp = [0 for i in range(number+1)] dp[number-1] = nums[number-1] for i in range(number-2,-1,-1): dp[i] = max(dp[i+1],dp[i+2]+nums[i]) return dp[0]