213.house-robber-ii.go 531 B

12345678910111213141516171819202122232425
  1. func rob(nums []int) int {
  2. n := len(nums)
  3. if n == 0 {
  4. return 0
  5. } else if n == 1 {
  6. return nums[0]
  7. }
  8. dp := make([][]int, 2) // dp[0][i]: pick first element; dp[1][i]: do not pick.
  9. for i := range dp {
  10. dp[i] = make([]int, n)
  11. }
  12. dp[0][1] = nums[0]
  13. for i := 2; i < n; i++ {
  14. dp[0][i] = maxInt(dp[0][i-1], nums[i-1]+dp[0][i-2])
  15. dp[1][i] = maxInt(dp[1][i-1], nums[i-1]+dp[1][i-2])
  16. }
  17. return maxInt(dp[0][n-1], maxInt(dp[1][n-2]+nums[n-1], dp[1][n-1]))
  18. }
  19. func maxInt(x, y int) int {
  20. if x < y {
  21. return y
  22. }
  23. return x
  24. }