2022-03-20:给定一棵多叉树的头节点head, 每个节点的颜色只会是0、1、2、3中的一种, 任何两个节点之间的都有路径, 如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径, (
2022-03-20:给定一棵多叉树的头节点head,
每个节点的颜色只会是0、1、2、3中的一种,
任何两个节点之间的都有路径,
如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径,
(a -> … -> b)和(b -> … -> a)算两条路径。
求多叉树上达标的路径一共有多少?
点的数量 <= 10^5。
答案2022-03-20:
方法一:自然智慧,所有节点两两对比。
方法二:递归,前缀和+后缀和+位运算。目前是最难的。
当前节点是起点,当前节点是终点。
子节点两两对比。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
root := NewNode(0)
root.nexts = make([]*Node, 2)
root.nexts[0] = NewNode(1)
root.nexts[1] = NewNode(2)
root.nexts[0].nexts = make([]*Node, 1)
root.nexts[0].nexts[0] = NewNode(3)
ret := colors3(root)
fmt.Println(ret)
}
type Node struct {
color int
nexts []*Node
}
func NewNode(c int) *Node {
ans := &Node{}
ans.color = c
ans.nexts = make([]*Node, 0)
return ans
}
type Info struct {
// 我这棵子树,总共合法的路径有多少?
all int
// 课上没有强调!但是请务必注意!
// 一定要从头节点出发的情况下!
// 一定要从头节点出发的情况下!
// 一定要从头节点出发的情况下!
// 走出来每种状态路径的条数
colors []int
}
func NewInfo() *Info {
ans := &Info{}
ans.all = 0
ans.colors = make([]int, 16)
return ans
}
func colors3(head *Node) int {
if head == nil {
return 0
}
return process3(head).all
}
var consider = [][]int{{}, // 0
{14, 15}, // 1 -> 0001
{13, 15}, // 2 -> 0010
{12, 13, 14, 15}, // 3 -> 0011
{11, 15}, // 4 -> 0100
{10, 11, 14, 15}, // 5 -> 0101
{9, 11, 13, 15}, // 6 -> 0110
{8, 9, 10, 11, 12, 13, 14, 15}, // 7 -> 0111
{7, 15}, // 8 -> 1000
{6, 7, 14, 15}, // 9 -> 1001
{5, 7, 13, 15}, // 10 -> 1010
{4, 5, 6, 7, 12, 13, 14, 15}, // 11 -> 1011
{3, 7, 11, 15}, // 12 -> 1100
{2, 3, 6, 7, 10, 11, 14, 15}, // 13 -> 1101
{1, 3, 5, 7, 9, 11, 13, 15}, // 14 -> 1110
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, // 15 -> 1111
}
func process3(h *Node) *Info {
ans := NewInfo()
hs := 1 << h.color
ans.colors[hs] = 1
if len(h.nexts) > 0 {
n := len(h.nexts)
infos := make([]*Info, n+1)
for i := 1; i <= n; i++ {
infos[i] = process3(h.nexts[i-1])
ans.all += infos[i].all
}
lefts := make([][]int, n+2)
for i := 0; i < n+2; i++ {
lefts[i] = make([]int, 16)
}
for i := 1; i <= n; i++ {
for status := 1; status < 16; status++ {
lefts[i][status] = lefts[i-1][status] + infos[i].colors[status]
}
}
rights := make([][]int, n+2)
for i := 0; i < n+2; i++ {
rights[i] = make([]int, 16)
}
for i := n; i >= 1; i-- {
for status := 1; status < 16; status++ {
rights[i][status] = rights[i+1][status] + infos[i].colors[status]
}
}
for status := 1; status < 16; status++ {
ans.colors[status|hs] += rights[1][status]
}
ans.all += ans.colors[15] << 1
for from := 1; from <= n; from++ {
for fromStatus := 1; fromStatus < 16; fromStatus++ {
for _, toStatus := range consider[fromStatus|hs] {
ans.all += infos[from].colors[fromStatus] * (lefts[from-1][toStatus] + rights[from+1][toStatus])
}
}
}
}
return ans
}
执行结果如下:

2022-03-20:给定一棵多叉树的头节点head, 每个节点的颜色只会是0、1、2、3中的一种, 任何两个节点之间的都有路径, 如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径, (的更多相关文章
- 2022.02.20 SA
2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...
- hdu6003 Problem Buyer 贪心 给定n个区间,以及m个数,求从n个区间中任意选k个区间,满足m个数都能在k个区间中找到一个包含它的区间,如果一个区间包含了x,那么 该区间不能再去包含另一个数,即k>=m。求最小的k。如果不存在这样的k,输出“IMPOSSIBLE!”。
/** 题目:hdu6003 Problem Buyer 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6003 题意:给定n个区间,以及m个数,求从n个区 ...
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...
- 2021.03.20【NOIP提高B组】模拟 总结
区间 DP 专场:愉快爆炸 T1 题目大意 有 \(n\) 个有颜色的块,连续 \(k\) 个相同颜色的就可以消掉 现在可以在任意位置插入任意颜色的方块,问最少插入多少个可以全部抵消 题解 先把连续的 ...
- Redis 哨兵节点之间相互自动发现机制(自动重写哨兵节点的配置文件)
Redis的哨兵机制中,如果是多哨兵模式,哨兵节点之间也是可以相互感知的,各种搜索之后出来的是千篇一律的一个基础配置文件,在配置当前哨兵节点的配置文件中,并没有配置其他哨兵节点的任何信息.如下是一个哨 ...
- 【点分治】【路径小于等于k的条数】【路径恰好等于k是否存在】
POJ1741:Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29574 Accepted: 9915 Des ...
- [19/03/29-星期五] IO技术_File(文件)类(可操作文件,不能操作其里边内容,位于Java.io 包中)&递归遍历
一.概念 java.io.File类:代表文件和目录. 在开发中,读取文件.生成文件.删除文件.修改文件的属性时经常会用到本类. 以pathname为路径创建File对象,如果pathname是相对路 ...
- PHP 文件包含总结 include require 命名空间 autoload spl_autoload_register 读取文件路径
总结: 1. include或require包含其他文件 使用./或者 ../,这里的当前路径和上一层路径,取决于运行脚本的路径,会存在如下问题. 在写PHP程序时,经常要用到include或requ ...
- 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。
分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...
- Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块
Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...
随机推荐
- 1.1 [zabbix5.4]-部署
一.从容器安装 1.0 官网 https://www.zabbix.com/documentation/5.0/zh/manual/installation/containers # 官方文档 h ...
- JsonResult向前端返回值,报错500
1,问题原因 因为返回信息为json对象,我在controller方法所在的入口类上,添加的注解是:@Controller 而@Controller是不适合返回json内容的 2,解决方法 方法一:不 ...
- gerrit部署使用
前言 gerrit是基于git的工具,code review功能是开发中很方便,此外它可以配合Jenkins进行自动化的编译工作.今天给大家分享一下gerrit在ubuntu的安装使用 作者:良知犹存 ...
- 一篇文章带你快速入门学习RPA
大纲: 什么是RPA? RPA的应用领域有哪些? RPA机器人技术一般用于什么行业? RPA的市场需求是什么? RPA项目的实施过程? RPA的未来趋势怎么样? 什么是RPA? RPA 全称& ...
- 使用ASP.NET CORE SignalR实现APP扫描登录
使用signalr实现APP扫码登录 1. 背景介绍 在移动化时代,web开发很多时候都会带着移动端开发,这个时候为了减少重复输入账号密码以及安全性,很多APP端都会提供一个扫码登录功能,web端生成 ...
- diyudio 3886 功放机鉴赏
- Solon Initializr v1.2 发布
Solon Initializr 是 Solon 框架的模板生成器项目.本期更新增加了快捷组合包的依赖选择,并生成对应的项目模板. 更新说明 增加 Solon Lib 依赖选择,并生成对应项目 增加 ...
- 阿里巴巴为什么建议使用BigDecimal进行浮点数运算
本文先引入一个例子,星期天你和女朋友去逛街,看到一家奶茶店.女朋友想喝奶茶了,你就去买了杯奶茶,然后你问了一下价格.店员说奶茶0.9元一杯.然后你给了1元钱.这个时候你忽然问了一下女友.服务员该找我们 ...
- 传输层和网络层的checksum区别,TCP cksum为何包含伪首部
一直搞不清传输层和网络层的校验和为什么校验内容不一样,最近问了一些前辈,找寻了一些答案,总结一下自己的思考. 先说一下传输层(TCP)和网络层(IP)的校验和: TCP校验和有伪首部.TCP herd ...
- go语言之UDP通信
服务端 package main import ( "fmt" "net" ) func main() { listen, err := net.ListenU ...