1. 程式人生 > >【Leetcode】打家劫舍 I and 打家劫舍 II(動態規劃)PYTHON

【Leetcode】打家劫舍 I and 打家劫舍 II(動態規劃)PYTHON

198.打家劫舍
題目表述:
你是一個專業的強盜,計劃搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡警方。
給定一個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒警方的情況下搶劫的最高金額。
PYTHON:

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)

        ll = [0
for i in range(n)] if n == 0: return 0 if n == 1: return nums[0] if n == 2: return max(nums) else: ll[0] = nums[0] ll[1] = max(nums[0],nums[1]) for i in range(2,len(nums)): ll[i] = max(ll[i-2
] + nums[i],ll[i-1]) return ll[n-1]
  1. 打家劫舍 II
    題目描述:
    在上次盜竊完一條街道之後,竊賊又轉到了一個新的地方,這樣他就不會引起太多注意。這一次,這個地方的所有房屋都圍成一圈。這意味著第一個房子是最後一個是緊挨著的。同時,這些房屋的安全系統與上次那條街道的安全系統保持一致。
    給出一份代表每個房屋存放錢數的非負整數列表,確定你可以在不觸動警報的情況下盜取的最高金額。
    PYTHON:
class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
n = len(nums) out1 = [0 for x in range(n)] out2 = [0 for x in range(n)] if n == 0: return 0 if n == 1 : return nums[0] if n == 2 : return max(nums[0],nums[1]) else: out1[0] = nums[0] out2[1] = nums[1] out1[1] = max(nums[0],nums[1]) out2[2] = max(nums[1],nums[2]) for i in range(2,n-1): out1[i] = max(out1[i-2] + nums[i],out1[i-1]) out2[i+1] = max(out2[i-1] + nums[i+1],out2[i]) return max(out1[n-2],out2[n-1])

思路:因為房子是環形的,所以不能在打劫了第一座房子之後還打劫第二座房子,所以說分兩種情況分別計算:1,不打劫第一座房子;2,不打劫最後一座房子,取最大即可。