トピックリンクします。https://leetcode-cn.com/problems/house-robber/
件名の説明:
あなたは、家の通りの計画を盗むためにプロの泥棒です。同じ夜上の2つの隣接する家は、泥棒はシステムが自動的にアラームに押し入り場合は各部屋にはいくつかの現金を所持している、盗難防止システムが装備されているあなたの隣人の家を盗む影響を与える唯一の制約は、相互に通信します。
もし警報装置に触れていない場合に算出ハウジングストレージ量の各非負整数配列から代表所与は、に最大量を盗むことができます。
例:
例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
アイデア:
ダイナミックプログラミング
思考:トップダウン
アイデアII:ボトムアップ
ダイナミック式:dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1])
私たちは疑問を持って、メッセージを残すために歓迎!
コード:
考えました:
class Solution:
def rob(self, nums: List[int]) -> int:
import functools
n = len(nums)
@functools.lru_cache(None)
def helper(i):
if i >= n: return 0
return max(helper(i + 1), nums[i] + helper(i + 2))
return helper(0)
2考えます:
class Solution:
def rob(self, nums: List[int]) -> int:
n = len(nums)
if n == 0: return 0
dp = [0] * (n + 1)
dp[1] = nums[0]
for i in range(2,n + 1):
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1])
return dp[-1]