模版题-动态规划-打家劫舍II( 环形转换 )

管理员
```python class Solution: def rob(self, nums: List[int]) -> int: # 所有的房屋都围成一圈, # 这意味着第一个房屋和最后一个房屋是紧挨着的。 # 那么实际影响能否偷取的就是第一个和最后一个房屋。 # 考虑偷取第一个房屋( 可以不偷取 ), 那么偷取范围就是[ 0 ~ n - 1 ] # 考虑偷取最后的房屋( 可以不偷取 ), 那么偷取范围就是[ 1 ~ n ] # 这样环形就转换为线性的了,取三者的最大值即可 ( 上述三者将所有情况均容纳 )。 def rob_range( l, r ): # 左闭右闭区间 n = r - l + 1 # dp[ i ][ 0 ] 不偷i号房屋的最大金额 # dp[ i ][ 1 ] 偷取i号房屋的最大金额 dp = [ [ 0, 0 ] for _ in range( n ) ] dp[ 0 ][ 0 ] = 0 dp[ 0 ][ 1 ] = nums[ l ] for i in range( 1, n ): dp[ i ][ 0 ] = max( dp[ i - 1 ][ 0 ], dp[ i - 1 ][ 1 ] ) dp[ i ][ 1 ] = dp[ i - 1 ][ 0 ] + nums[ l + i ] return max( dp[ n - 1 ][ 0 ], dp[ n - 1 ][ 1 ] ) m = len( nums ) if m == 0: return 0 if m == 1: return nums[ 0 ] return max( rob_range( 0, m - 2 ), rob_range( 1, m - 1 ) ) ```
评论 0

发表评论 取消回复

Shift+Enter 换行  ·  Enter 发送
还没有评论,来发表第一条吧