https://leetcode-cn.com/problems/house-robber-ii/
思路:
1. 题目求数组非连续元素的最大和,状态转移方程为:
dp[n] = max(dp[n-1],dp[n-2] + num)
2. 第二题要求 取了第0号num就不能要最后一项num,我就正反算了两边,通过了,时间效率比较低,我现在去看看答案。
注意:
我的版本:用了一个二维数组来记录路径,然后再顺序倒序运行两遍。。。
答案版本:直接运行 max(my_rob(nums[:-1]),my_rob(nums[1:])) if len(nums) != 1 else nums[0]
收获:
状态转移方程一定要想清楚再动笔啊 - -
代码:
class Solution:
def rob(self, nums: List[int]) -> int:
def robOnce(nums):
dpFst,dpSec = 0,0
dp = [[i] for i in range(len(nums))]
print(dp)
selection = -1
if len(nums)<4: return max(nums) if nums else 0
for i in range(len(nums)-1):
if dpFst + nums[i] > dpSec:
if i > 1:dp[i] += dp[i-2]
cur = dpFst + nums[i]
elif dpFst + nums[i] == dpSec:
if i>1 and 0 not in dp[i-2]:dp[i] += dp[i-2]
elif i>0 and 0 not in dp[i-1]:dp[i] = dp[i-1]
elif i > 0: dp[i] = dp[i-1]
cur = dpFst + nums[i]
else:
if i>0 :dp[i] = dp[i-1]
cur = dpSec
print(dp)
dpFst,dpSec = dpSec,cur
print(dpFst,dpSec)
#如果选了0号元素,则不考虑最后一个
print(dp)
if 0 in dp[-3]:
print('first')
print(dpFst,dpSec)
return max(dpFst,dpSec)
else:
print('sec')
print (dpFst,nums[-1],dpSec)
return max(dpFst+nums[-1],dpSec)
a = robOnce(nums)
b = robOnce(nums[::-1])
return max(a,b)