概述
附近有几所房子。每栋房子里都有一些钱。这些房子被表示为一个数组,数组中的每一个条目都表示该房子的钱数。
例如,如果我们有以下数组
[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.