Go(Golang)中的房屋抢劫问题的程序

80 阅读2分钟

概述

附近有几所房子。每栋房子里都有一些钱。这些房子被表示为一个数组,数组中的每一个条目都表示该房子的钱数。

例如,如果我们有以下数组

[2, 3, 4, 2]

那么

  • 第一所房子有2个

  • 第二所房子有3个

  • 第三家4笔钱

  • 第四所房子有2笔钱

抢劫者可以抢劫任何数量的房子,但他不能在两个连续的房子里抢劫。例如,他可以在下面的组合中抢夺上述阵列的钱财

  • 1和3

  • 1和4

  • 2和4

上述组合中没有一个房子是相邻的。问题是要确定哪种组合能给抢劫者带来最大的收入。

例如,在上述情况下,第一个组合(1和3)将给他带来最大的抢劫,即2+4=6,因此抢劫者可以在第一和第三间房子里抢劫,即2+4=6。

另一个例子

Input: [1, 6, 8, 2, 3, 4]
Output: 13

抢劫者可以在第一、第三和第六间房子里抢劫,即1+8+4=13

这是一个动态编程问题,因为它有一个最优的子结构。假设数组的名称是金钱

  • dp[0] = money[0] 。

  • dp[1] = max(money[0], money[1])

  • dp[2] = max(money[0]+ money[1), money[2])

  • dp[i] = dp[i] + max(dp[i-1], dp[i-1] )

其中dp[i]表示如果第i个房子被包括在内,劫匪可以抢劫的金额。最后,我们返回dp数组中的最大值

程序

以下是相同的程序。

package main

import "fmt"

func rob(nums []int) int {
	lenNums := len(nums)

	if lenNums == 0 {
		return 0
	}

	maxMoney := make([]int, lenNums)

	maxMoney[0] = nums[0]

	if lenNums > 1 {
		maxMoney[1] = nums[1]
	}

	if lenNums > 2 {
		maxMoney[2] = nums[2] + nums[0]
	}

	for i := 3; i < lenNums; i++ {
		if maxMoney[i-2] > maxMoney[i-3] {
			maxMoney[i] = nums[i] + maxMoney[i-2]
		} else {
			maxMoney[i] = nums[i] + maxMoney[i-3]
		}

	}

	max := 0
	for i := lenNums; i < lenNums; i++ {
		if maxMoney[i] > max {
			max = maxMoney[i]
		}
	}

	return max
}

func main() {
	output := rob([]int{2, 3, 4, 2})
	fmt.Println(output)

	output = rob([]int{1, 6, 8, 2, 3, 4})
	fmt.Println(output)

}

输出

6
13

注意: 请查看我们的Golang高级教程。这个系列的教程是精心设计的,我们试图用例子涵盖所有的概念。本教程是为那些希望获得专业知识和对Golang有扎实了解的人准备的 -Golang高级教程

如果你有兴趣了解如何在Golang中实现所有设计模式。如果是的话,那么这篇文章就是为你准备的--所有设计模式 Golang

The postProgram for House Robber Problem in Go (Golang)appeared first onWelcome To Golang By Example.