模版题-动态规划-打家劫舍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 ) )
```