2021-02-26:一个数组arr是二叉树的中序遍历结果,每条边的开销是父节点和子节点的乘积,总开销是所有边的开销之和。请问最小总开销是多少?

链接:https://www.nowcoder.com/questionTerminal/0d939e874a004f449a370aca1346dd5c

来源:牛客网

小团有一个由N个节点组成的二叉树,每个节点有一个权值。定义二叉树每条边的开销为其两端节点权值的乘积,二叉树的总开销即每条边的开销之和。小团按照二叉树的中序遍历依次记录下每个节点的权值,即他记录下了N个数,第i个数表示位于中序遍历第i个位置的节点的权值。之后由于某种原因,小团遗忘了二叉树的具体结构。在所有可能的二叉树中,总开销最小的二叉树被称为最优二叉树。现在,小团请小美求出最优二叉树的总开销。

输入描述:

第一行输入一个整数N(1<=N<=300),表示二叉树的节点数。

第二行输入N个由空格隔开的整数,表示按中序遍历记录下的各个节点的权值,所有权值均为不超过1000的正整数。

输出描述:

输出一个整数,表示最优二叉树的总开销。

福哥答案2021-02-26:

自然智慧即可。

1.递归。有代码。

2.记忆化搜索。有代码。

代码用golang编写,代码如下:

package main

import "fmt"

const MAX = int(^uint(0) >> 1)

//https://www.nowcoder.com/questionTerminal/0d939e874a004f449a370aca1346dd5c
func main() {
arr := []int{7, 6, 5, 1, 3}
ret := f1(arr)
fmt.Println("1.递归:", ret) ret = f2(arr)
fmt.Println("2.记忆化搜索:", ret)
} func f1(arr []int) int {
arrLen := len(arr)
if arrLen <= 1 {
return 0
}
return process1(arr, -1, 0, arrLen-1)
} func process1(arr []int, cur int, L int, R int) int {
length := R - L + 1
if length == 0 {
return 0
}
ans := MAX
for i := L; i <= R; i++ {
temp := 0
if cur >= 0 {
temp = arr[cur] * arr[i]
}
ans = getMin(temp+process1(arr, i, L, i-1)+process1(arr, i, i+1, R), ans)
}
return ans } func f2(arr []int) int {
arrLen := len(arr)
if arrLen <= 1 {
return 0
}
dp := make([][][]int, arrLen+1)
for i := 0; i < arrLen+1; i++ {
dp[i] = make([][]int, arrLen)
for j := 0; j < arrLen; j++ {
dp[i][j] = make([]int, arrLen)
for k := 0; k < arrLen; k++ {
dp[i][j][k] = -1
}
}
} ret := process2(arr, -1, 0, arrLen-1, dp)
//fmt.Println(dp)
return ret
} func process2(arr []int, cur int, L int, R int, dp [][][]int) int {
length := R - L + 1
if length == 0 {
return 0
}
if dp[cur+1][L][R] != -1 {
//fmt.Println("记忆化", dp[cur+1][L][R])
return dp[cur+1][L][R]
}
ans := MAX
for i := L; i <= R; i++ {
temp := 0
if cur >= 0 {
temp = arr[cur] * arr[i]
}
ans = getMin(temp+process2(arr, i, L, i-1, dp)+process2(arr, i, i+1, R, dp), ans)
}
dp[cur+1][L][R] = ans
return ans }
func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
}

执行结果如下:


评论

2021-02-26:一个数组arr是二叉树的中序遍历结果,每条边的开销是父节点和子节点的乘积,总开销是所有边的开销之和。请问最小总开销是多少?的更多相关文章

  1. 《剑指offer》第八题(重要!查找二叉树的中序遍历的下一个结点)

    文件一:main.cpp // 面试题:二叉树的下一个结点 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? // 树中的结点除了有两个分别指向左右子结点的指针以外,还有 ...

  2. LeetCode 94:二叉树的中序遍历 Binary Tree Inorder Traversal

    题目: 给定一个二叉树,返回它的中序 遍历. Given a binary tree, return the inorder traversal of its nodes' values. 示例: 输 ...

  3. [LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  4. LeetCode(94):二叉树的中序遍历

    Medium! 题目描述: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗 ...

  5. 【LeetCode题解】94_二叉树的中序遍历

    目录 [LeetCode题解]94_二叉树的中序遍历 描述 方法一:递归 Java 代码 Python代码 方法二:非递归 Java 代码 Python 代码 [LeetCode题解]94_二叉树的中 ...

  6. LeetCode 94. 二叉树的中序遍历(Binary Tree Inorder Traversal)

    94. 二叉树的中序遍历 94. Binary Tree Inorder Traversal 题目描述 给定一个二叉树,返回它的 中序 遍历. LeetCode94. Binary Tree Inor ...

  7. Leetcode题目94.二叉树的中序遍历(中等)

    题目描述: 给定一个二叉树,返回它的中序遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 思路解析: 1 ...

  8. leecode刷题(29)-- 二叉树的中序遍历

    leecode刷题(29)-- 二叉树的中序遍历 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 思路 跟 ...

  9. Java实现 LeetCode 94 二叉树的中序遍历

    94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...

  10. 【LeetCode】94. 二叉树的中序遍历

    94. 二叉树的中序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 输入:root = [1,null,2,3] 输出:[1, ...

随机推荐

  1. webservice学习随笔(一):简单的webservice实例

    一.webService概念简单介绍: 简单来说,webservice就是远程调用技术,也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的 ...

  2. python-魔法函数-__str__ __repr__ 的一次异常

    # encoding: utf-8import loggingERROR_NOT_FOUNDED_FILE = "error_not_founded_file"class Gene ...

  3. idea 调试小心得

    1.为什么需要Debug 目的:开发过程中 查找或定位错误或者阅读源码 程序运行的结果(4种情况) 情况1:没有任何bug,程序执行正确! 情况2: 运行以后,出现了错误或异常信息.但是通过 日志文件 ...

  4. 今日Python相关练习

    1.计算日期范围内的所有日期 def get_date_list(begin_date,end_date): date_list = [] while begin_date <= end_dat ...

  5. Axios的js文件的下载教程+相关应用

    下载教程来啦! 1.进入GitHub网站,网址在这里:http://github.com 2.去搜索框搜索Axios,得到如下界面: 3.然后选择这里: 会出现如下界面: 4.点击右方的绿色按钮&qu ...

  6. 文件的上传&预览&下载学习(一)

    注:主要是说明后端逻辑和数据库表设计 1.当前主流的几种文件上传&预览&下载方式 把文件直接存储在服务器 分布式存储OSS,比如阿里OSS.Minio 2.数据库表设计 由于文件都是跟 ...

  7. Racket while循环

    Problem: 1805. 字符串中不同整数的数目 目录 lc题解地址 思路 Code lc题解地址 https://leetcode.cn/problems/number-of-different ...

  8. 【WEB UI自动化】Selenium爬取用户的知乎回答时遇到10002:请求参数异常,请升级客户端后重试

    这里分享一个低配版知乎爬虫,利用了Selenium模块 爬取的过程中遇到了10002:请求参数异常,请升级客户端后重试,调用知乎某用户的回答API返回的HTTP状态码是403 Forbidden 之后 ...

  9. KCP协议浅析

    概述 KCP协议结合了TCP和UDP协议的特点,是一个快速可靠的协议. 引述官方介绍: KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大 ...

  10. CISCN2021-第十四届全国大学生信息安全竞赛-WriteUp

    WriteUp - Maple_root -CISCN2021 总结 总得分:3400 总排名:203 赛区排名:21 第一次认真参加正式的CTF,24+3小时的脑血栓比赛时长,收获还是很多的. 开卷 ...