動態規劃-打家劫舍/最長上升子序列

198. 打家劫舍

你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,
影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,
如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 1:
輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。
     偷竊到的最高金額 = 1 + 3 = 4 。
示例 2:
輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接着偷竊 5 號房屋 (金額 = 1)。
     偷竊到的最高金額 = 2 + 9 + 1 = 12 。
from typing import List
class Solution:
    def rob(self, nums: List[int]) -> int:
        l =len(nums)
        if l==0: return 0
        if l==1: return nums[0]
        if l==2:    return max(nums[0],nums[1])

        nums[2] = max(nums[1], nums[0]+nums[2])
        for i in range(3,l):
            nums[i] = max(nums[i-1], nums[i]+nums[i-2],nums[i]+nums[i-3])

        return nums[-1] if nums[-1]>nums[-2] else nums[-2]


if __name__ == "__main__":
    s= Solution()
    nums = [2,7,9,3,1]
    nums = [1,2,3,1]
    r = s.rob(nums)
    print(r)

300. 最長上升子序列

給定一個無序的整數數組,找到其中最長上升子序列的長度。

示例:
輸入: [10,9,2,5,3,7,101,18]
輸出: 4
解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4。
說明:

可能會有多種最長上升子序列的組合,你只需要輸出對應的長度即可。
你算法的時間複雜度應該爲 O(n2)
進階: 你能將算法的時間複雜度降低到 O(n log n) 嗎?

from typing import List
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        l = len(nums)
        if l == 0:    return 0
        if l == 1:    return 1
        dp = [1 for i in range(l)]
        dp[1] = 2 if nums[1] > nums[0] else 1

        for i in range(2, l):
            for j in range(i - 1, -1, -1):
                if nums[i] > nums[j] and dp[i] < dp[j] + 1:
                    dp[i] = dp[j] + 1

        return max(dp)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章