题解 | #打家劫舍(二)#

打家劫舍(二)

http://www.nowcoder.com/practice/a5c127769dd74a63ada7bff37d9c5815

还是dp,只是相较于没有首末次约束的情况下多了一个思维过程而已。由于不能同时偷首末家,因此一共有三种可能:偷最多的钱要么是1.偷了首家,不偷末家,要么是2.偷了末家,不偷首家,要么是3.首末家都没偷。因此可以做两个dp向量,一个dp不包括首家,一个dp不包括末家,最后返回两者较大者即可。

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @return int整型
#
class Solution:
    def rob(self , nums) -> int:
        # write code here
        dp1 = [0] * len(nums)  # 包含首家,不包含末家
        dp2 =[0] * len(nums)   # 包含末家,不包含首家
        for i in range(len(nums)):
            if i == 0:
                dp1[0] = nums[0]
            elif i==1:
                dp1[1] = max(nums[0] , nums[1])
                dp2[1] = nums[1]
            else:
                dp1[i] = max(dp1[i-2] + nums[i] , dp1[i-1])
                dp2[i] = max(dp2[i-2]+nums[i] , dp2[i-1])
        return max(dp1[-2] , dp2[-1])

nums = [1,3,6]
print(Solution().rob(nums))


全部评论

相关推荐

巧克力1:双选会不如教室宣讲会
点赞 评论 收藏
分享
威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
5 1 评论
分享
牛客网
牛客企业服务