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
}

执行结果如下:


左神java代码

2022-03-20:给定一棵多叉树的头节点head, 每个节点的颜色只会是0、1、2、3中的一种, 任何两个节点之间的都有路径, 如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径, (的更多相关文章

  1. 2022.02.20 SA

    2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...

  2. 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个区 ...

  3. hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

    /** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...

  4. 2021.03.20【NOIP提高B组】模拟 总结

    区间 DP 专场:愉快爆炸 T1 题目大意 有 \(n\) 个有颜色的块,连续 \(k\) 个相同颜色的就可以消掉 现在可以在任意位置插入任意颜色的方块,问最少插入多少个可以全部抵消 题解 先把连续的 ...

  5. Redis 哨兵节点之间相互自动发现机制(自动重写哨兵节点的配置文件)

    Redis的哨兵机制中,如果是多哨兵模式,哨兵节点之间也是可以相互感知的,各种搜索之后出来的是千篇一律的一个基础配置文件,在配置当前哨兵节点的配置文件中,并没有配置其他哨兵节点的任何信息.如下是一个哨 ...

  6. 【点分治】【路径小于等于k的条数】【路径恰好等于k是否存在】

    POJ1741:Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 29574   Accepted: 9915 Des ...

  7. [19/03/29-星期五] IO技术_File(文件)类(可操作文件,不能操作其里边内容,位于Java.io 包中)&递归遍历

    一.概念 java.io.File类:代表文件和目录. 在开发中,读取文件.生成文件.删除文件.修改文件的属性时经常会用到本类. 以pathname为路径创建File对象,如果pathname是相对路 ...

  8. PHP 文件包含总结 include require 命名空间 autoload spl_autoload_register 读取文件路径

    总结: 1. include或require包含其他文件 使用./或者 ../,这里的当前路径和上一层路径,取决于运行脚本的路径,会存在如下问题. 在写PHP程序时,经常要用到include或requ ...

  9. 给定一个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]} ...

  10. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

随机推荐

  1. react+ant-design-proTable 设置搜索条件中的默认值

    需求: 这个规则组ID的 下拉列表是通过向后端请求获取的,如何设置自定义渲染列表,并且默认有值 let groupLists = [] as any, //规则组列表 defaultValue = ' ...

  2. DRF_基本使用

    基本使用 视图内 from rest_framework.viewsets import ModelViewSet from app01 import models from app01 import ...

  3. mysql查询近N天的数据

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  4. Feign报错:The bean 'xxxxx.FeignClientSpecification' could not be registered.

    解决方法: spring: main: allow-bean-definition-overriding: true 参考博客:https://www.cnblogs.com/lifelikeplay ...

  5. opencv筛选轮廓的几种方法总结

    在使用opencv处理图像的时候,在获取ROI区域这一步用的最多的就是找到指定区域,一般是根据轮廓提取,我们可以通过opencv中的findContours()函数来查找图片中的轮廓,但是会发现找到的 ...

  6. 示例:iptables限制ssh链接服务器

    linux服务器默认通过22端口用ssh协议登录,这种不安全.今天想做限制,即允许部分来源ip连接服务器. 案例目标:通过iptables规则限制对linux服务器的登录. 处理方法:编写为sh脚本, ...

  7. Windows 系统下怎么获取 UDP 本机地址

    Windows 系统下怎么获取 UDP 本机地址 我们知道 UDP 获取远端地址非常简单,通常接口 recvfrom 就可以直接获取到远端的地址和端口:如果获取 UDP 的本机地址就需要点特殊处理了, ...

  8. Maven 自动化构建

    一.Maven:是一款服务于 Java平台的自动化构建工具 [1]Maven可以将一个项目按模块划分成不同的工程,利于分工协作;[2]Maven可以将 jar包保存在自己的中央"仓库&quo ...

  9. MySQL 高级查询截取分析

    慢日志分析流程如下:[1]观察(至少跑一天),看看生产慢 SQL 情况.[2]开启慢查询日志,设置阈值,比如对超过5秒的 SQL 语句进行抓取.[3]explain+慢 SQL 分析.[4]show ...

  10. 常用ADB命令使用方法

    移动端操作流程 在设置中找到关于手机(或关于平板电脑) 连续点击版本号5次 在系统和更新中点击开发者选项 打开USB调试功能 PC端操作流程 打开cmd或powershell 移动到adb.exe所在 ...