环境
使用的是牛客的平台,ACM输入输出
2021.6.13夏令营第二批面试
题目1
给定一颗完全二叉树,按规则选择结点。如果选择了一个节点的任意子节点(或两个都选),就不能选择该结点。(说白了就是一条连线两端只能选一个节点)求选择结点的值的和最大值多少。
输入:
第一行是二叉树结点个数
第二行是按行遍历顺序的完全二叉树
如:
3
8 4 6
输出:
10
题解:
类似于leetcode的打家劫舍问题,和打家劫舍3一模一样。
package main
import "fmt"
var N int
var tree []int
func main() {
fmt.Scan(&N)
tree = make([]int, N)
for i := 0; i < N; i++ {
fmt.Scan(&tree[i])
}
//N = 9
//tree = []int{5194, 34, 91, 51, 72, 46, 12, 9812, 6054}
result := dfs1(0)
fmt.Println(max(result[0], result[1]))
}
func dfs1(n int) []int {
if n > N-1 {
return []int{
0, 0}
}
l, r := dfs1(2*n+1), dfs1(2*n+2)
selected := tree[n] + l[1] + r[1]
noselected := max(l[0], l[1]) + max(r[0], r[1])
return []int{
selected, noselected}
}
func max(a, b int) int {
if a > b {
return a
}
return b
}