動態規劃 打家劫舍 最長上公升子串行

2021-10-06 05:45:45 字數 1736 閱讀 8552

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,

影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,

如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例 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)

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

示例:輸入: [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)

動態規劃 最長上公升子串行

問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...

動態規劃 最長上公升子串行

動態規劃 儲存遞迴中間結果,減少遞迴次數 總時間限制 2000ms 記憶體限制 65536kb 描述 乙個數的序列 bi,當 b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2 an 我們可以得到一些上公升的子串行 ai1,ai2 aik 這裡1 i1 i2 ik n。...

動態規劃 最長上公升子串行

總時間限制 2000ms 記憶體限制 65536kb 描述乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它...