秋招突击——6/10——复习{(树形DP)树的最长路径、}——新作{电话号码的字母组合}

news2025/1/14 18:14:12

文章目录

    • 引言
    • 复习
      • 树形DP——树的最长路径
        • 思路分析
        • 参考思路
          • 求图的最长的直径的通用方法
            • 证明
          • 树形DP分析方法
            • 问题
        • 参考代码
            • 使用一维数组模拟邻接表存储树形结构或者稀疏图
    • 新作
      • 电话号码的组合
        • 思路分析
        • 参考实现
    • 总结

引言

  • 中间面试了两天,去上海呆了一天,在女朋友这里,休息了三天。

复习

树形DP——树的最长路径

在这里插入图片描述

思路分析
  • 这个可以想象成迷宫的寻路问题,然后总共有n-1条路径,最差的情况遍历n!的次数人,然后找到最优解,时间复杂度太高了。
  • 这样想可真的是太幼稚了,应该直接暴力枚举每一个点到其他店的最长的边,时间复杂度也就是O(n2)
  • 使用动态规划,找到状态表示?可以尝试一下,f【i】表示所有能够到达节点i的所有路径中的最长的值,但是不存在环路的问题,并且走过的节点不能再走一遍,我是不是应该保存对应的状态变化过程?
  • 我觉得可以先使用之前类似迷宫的动态规划思路,然后再增加一个回路检测的功能。
  • 在简化一下,遍历起点和终点,然后进行搜索。
  • 感觉不对,参考一下克鲁斯卡尔算法,但是实现起来没什么头绪
参考思路
求图的最长的直径的通用方法
  • 任取一点作为起点,找到距离该点最远的一个点u,使用BFS或者DFS进行搜搜
  • 再找到距离u最远的一个点v,同样是使用DFS或者BFS
  • 那么u和v之间的路径就是一条直径。
证明
  • 首先证明任取一个点u,u一定是某一个直径的一条端点,然后从u求出来的某一个最长的边是直径
  • 情况一,两个边之间没有任何的交点,可以使用反证法进行证明。
    在这里插入图片描述
  • 情况二,两者之间存在交点
    • 那么现在,有一个问题,就是比一个直径长的边,一定是直径吗?
      在这里插入图片描述
  • 通过上述证明,u一定是某一个直径的端点,然后在开始从u出发,找到对应节点v,uv就是对应的路径。
树形DP分析方法
  • 想办法把所有路径都枚举一边,然后找到边权和最大的边。集合分类的依据是什么?
    • 每条直径都有一个最高的点,然后找到挂到这个点上的所有路径的长度的最大值
    • 这里分类的依据就是,所有路径上最高的点是该点的路径集合中的权重之和的最大值
      • 这里还是很巧妙的,我每一次就不需要进行BFS或者DFS,只需要找当前的子节点的作为最高节点的路径

在这里插入图片描述

  • 以每一个点的为起点,然后计算以当前点为起点的所有路径中的最大值和次大值,然后累加和就是最大值。
  • 还有一种情况就是,直接一个点到底,仅仅取最大值就行了
问题
  • 虽然通过固定节点,对所有路径进行集合划分,但是有一个问题,如何定义最高的节点?以及如何确保没有回路的情况?
  • 这里的代码属实没有看懂,有以下几个问题
    • 使用若干个一维数组表示树形结构
    • 创建father参数方式回传。
参考代码
  • 这里还是没有看懂,时间不够了,花了很多时间,都不行
#include <iostream>
#include <cstring>

using namespace std;

const int N = 1e4 + 10, M = N << 1; //初始不确定树的拓扑结构,因此要建立双向边

int n;
int h[N], e[M], w[M], ne[M], idx;
int f1[N], f2[N], res;

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u, int father)
{
    f1[u] = f2[u] = 0;
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (j == father) continue;
        dfs(j, u);
        if (f1[j] + w[i] >= f1[u]) f2[u] = f1[u] ,f1[u] = f1[j] + w[i]; //最长路转移 
        else if (f1[j] + w[i] > f2[u]) f2[u] = f1[j] + w[i];            //次长路转移
    }
    res = max(res, f1[u] + f2[u]);
}
int main()
{
    memset(h, -1, sizeof h);
    scanf("%d", &n);
    for (int i = 0; i < n - 1; i ++ )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c), add(b, a, c);
    }
    dfs(1, -1); //我们可以任意选取一个点作为根节点,这样整棵树的拓扑结构被唯一确定下来了
    printf("%d\n", res);
    return 0;
}

作者:一只野生彩色铅笔
链接:https://www.acwing.com/solution/content/63883/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 这里先一步一步来吧,先解决树形数据的存储问题。
使用一维数组模拟邻接表存储树形结构或者稀疏图
  • h【n】:存储每一个节点的第一条边的索引
  • e【M】:存储边的终点
  • w【M】:存储每条边的权重
  • ne【M】:存储每条边下一条边的索引
  • idx:边的索引指针,初始值为0,用来记录边的数量

下述为添加边的具体代码

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
  • idx:是边的序号,因为这里是按照边的顺序添加边的
  • e[idx] = b:第idx边的终点是b
  • w[idx] = c:第idx边的权重是c
  • ne[idx] = h[a]:h【a】暂时还没有更新还是上一个邻接边的序号idx,所以,这里记录一下,当前邻接边的下一个边的序号是当前节点为起点的上一个临界边的序号
  • h[a] = idx++:记录一下,以a为起点,最新输入的边的索引,具体流程图应该如下

新作

电话号码的组合

题目链接

思路分析
  • 这里最多四个字符,然后每一个字符都表示三到四个字母,直接暴力搜索完全没有任何问题。
  • 实际上就三种情况,如果不追求代码的美观性,就多写几段,这里是想着用三层循环来写,然后增加美观性,写得太久了,没时间测试了。直接看源码。
vector<string> letterCombinations(string d) {
    unordered_map<char,string> s = {
            {'2',"abc"},
            {'3',"def"},
            {'4',"ghi"},
            {'5',"jkl"},
            {'6',"mno"},
            {'7',"pqrs"},
            {'8',"tuv"},
            {'9',"wxyz"},
    };

    vector<string> res,temp;


    // 给你一个字符串,然后遍历其中的每一个元素,往其中添加元素
    for (int i = 1; i <= d.size(); ++i) {
        for (int j = 0; j < s[d[i - 1]].size(); ++j) {
            // 判定是否为空的情况
            if (res.size() <= s[d[i - 1]].size()){
                string t;
                temp.emplace_back(t+=s[d[i - 1]][j]);
            }else
                for (auto x : res) {
                    x +=  s[d[i - 1]][j];
                    temp.push_back(x);
                }
            res = temp;
        }
    }
参考实现
  • 这里直接使用回溯实现,我应该多去想想看的,而且这里也没有使用很多的数据机构,使用的string数组实现,效果会更好。有很多技巧,需要我后续不断加深巩固学习。
  • 使用string表示映射
string strs[10] = {
    "","","abc","def"
    ,"ghi","jkl","mno"
    ,"pqrs","tuv","wxyz"
};
  • 将char转成数字
 for(auto c:strs[digits[u] - '0']){
 	dfs(digits, u + 1,path + c); }
  • 最终实现结果
    在这里插入图片描述

总结

  • 今天无论是新学的题目,还是复习的题目,都做得蛮差的,好好练习一下,后续总归会有进展的,加油
  • 今天学到了很多技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1810766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1992-2012年美国西海岸的海面高度异常数据集

Gridded Altimeter Fields with Enhanced Coastal Coverage 具有增强海岸覆盖范围的网格化测高场 简介 具有增强的海岸覆盖范围的网格化高度计场数据产品包含美国西海岸的海面高度异常&#xff08;SSHA 或 SLA&#xff09;以及北纬 35.25 度-48.5 度和东经 227.75 度-248.5 …

Java版商城:Spring Cloud+SpringBoot b2b2c实现多商家入驻、一件代发及免 费小程序商城搭建

1. 涉及平台 平台管理、商家端&#xff08;pc端、手机端&#xff09;、买家平台&#xff08;h5/公众号、小程序、app端&#xff08;ios/android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 spring cloud、spring boot、mybatis、redis 3. 前端框架…

PHP短链接短网址生成源码

下载地址&#xff1a;PHP短链接短网址生成源码 V3.0(11月14日更新) 1.更换用户中心模板 2.首页可以更换模板&#xff08;暂时只有俩套&#xff09; 3.增加首页背景更换 4.logo可以在后台设置 5.更换后台模板 6.优化访问统计功能 7.删除了几个没什么用的东西 8.数据表已支持全…

ARM32开发--串口库封装(初级)

知不足而奋进望远山而前行 目录 文章目录 前言 目标 内容 开发流程 文件目录创建 分组创建 接口定义 完整代码 总结 前言 在嵌入式软件开发中&#xff0c;封装抽取流程和抽取封装策略是非常重要的技术&#xff0c;能够提高代码的复用性和可维护性。本文将介绍如何在文…

操作系统安全:Windows系统安全配置,Windows安全基线检查加固

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

使用 C# 学习面向对象编程:第 4 部分

C# 构造函数 第 1 部分仅介绍了类构造函数的基础知识。 在本课中&#xff0c;我们将详细讨论各种类型的构造函数。 属性类型 默认构造函数构造函数重载私有构造函数构造函数链静态构造函数析构函数 请注意构造函数的一些基本概念&#xff0c;并确保你的理解非常清楚&#x…

Spring Boot 分片上传、断点续传、大文件上传、秒传,应有尽有

文件上传是一个老生常谈的话题了&#xff0c;在文件相对比较小的情况下&#xff0c;可以直接把文件转化为字节流上传到服务器&#xff0c;但在文件比较大的情况下&#xff0c;用普通的方式进行上传&#xff0c;这可不是一个好的办法&#xff0c;毕竟很少有人会忍受&#xff0c;…

怎么隐藏文件夹?4个方法保护文件!

“我在使用电脑时&#xff0c;想将一个比较重要的文件夹隐藏&#xff0c;但是不知道应该怎么操作&#xff0c;请大家给我出出主意。” 在数字化时代&#xff0c;我们的电脑和手机中存储着大量个人信息和敏感数据。其中&#xff0c;一些文件夹可能包含了不愿被他人轻易发现的私密…

【全篇】C语言从入门到入土

【全篇】C语言从入门到入土 文章目录 【全篇】C语言从入门到入土第一章 前言如何去学习&#xff0c;学习方法论 第二章 初识1.代码编译工具2.c程序的基础框架3.数据的表现形式变量1.要先定义后使用&#xff08;变量名的定义是由自己决定的&#xff0c;一般倾向于顾文生义&#…

Bankless:为什么 AI 需要 Crypto 的技术?

原文标题&#xff1a;《Why AI Needs Crypto’s Values》 撰文&#xff1a;Arjun Chand&#xff0c;Bankless 编译&#xff1a;Chris&#xff0c;Techub News 原文来自香港Web3媒体&#xff1a;Techub News 人工智能革命的梦想一直是一把双刃剑。 释放人工智能的潜力可以解…

MySQL高性能(MySQL锁)

MySQL性能系列 MySQL锁 前言1. 死锁机制2. 思维导图与锁划分介绍3. 粒度划分锁3.1. 全局锁3.2. 页级锁&#xff08;Page-level locking&#xff09;3.3. 表级锁&#xff08;Tables-level lock&#xff09;○ 共享锁&#xff08;表级&#xff09;○ 排他锁&#xff08;表级&…

JS 实现动态规划

function getPaths(m, n) {// m * n 二维数组&#xff0c;模拟网格const map new Array(m)for (let i 0; i < m; i) {map[i] new Array(n)}// 如果只走第一行&#xff0c;就只有一条路径。所以第一行所有 item 都填充 1map[0].fill(1)// 如果只走第一列&#xff0c;也只有…

vulnhub靶场:PWNOS: 2.0 (PRE-RELEASE)多种渗透方法

本文介绍靶机PWNOS: 2.0 的渗透方法&#xff0c;由于靶机系统比较老&#xff0c;尝试了几种不同的角度获得shell和提权。 1 环境搭建 根据提示信息&#xff0c;需要将网段设置为10.10.10.0/24&#xff0c;靶机ip为10.10.10.100。可以配置仅主机模式或NAT模式网卡&#xff0c;…

王学岗鸿蒙开发(北向)——————(十三)音乐播放器

AudioRenderer适合录音 AVPlayer:简单的本地单曲播放 MP3文件放置的地方 import media from ohos.multimedia.media import common from ohos.app.ability.common; Entry Component struct Index {//第1步&#xff1a;avPlayer:media.AVPlayer nullasync onPageShow(){//第…

Parallels Desktop 虚拟机必备软件有哪些 虚拟机软件有什么作用和用途

随着苹果M系列芯片电脑的推出&#xff0c;虚拟机的使用变得越来越流行。不同于苹果以往的Intel处理器电脑&#xff0c;其M系列芯片电脑无法安装双系统。如果要使用非macOS系统&#xff0c;可以通过创建虚拟机系统的方式实现。那么&#xff0c;虚拟机软件有什么作用和用途&#…

AXI Quad SPI IP核配置详解

AXI Quad SPI IP核&#xff08;Quad Serial Peripheral Interface&#xff09;是一个提供串行接口连接SPI从设备的解决方案&#xff0c;它支持Standard&#xff08;单线路&#xff09;、Dual&#xff08;双线路&#xff09;、Quad&#xff08;四线路&#xff09;模式&#xff0…

ARM32开发--外部中断EXTI

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 外部中断概念 中断触发机制 中断触发源 硬件外部中断 需求 开发流程 关心的内容 完整代码 软件外部中断 需求 开发流程 关心的内容 完整代码 中断消抖处理 系统计数模块 自定义计数器 systick完成…

LCD屏的价格和显示区的尺寸有关

LCD屏的价格和显示区的尺寸有关&#xff0c;和外尺寸无关。 下面通过12864点阵屏&#xff0c;对不同尺寸的屏&#xff0c;进行价格比较&#xff0c;就可以发现&#xff1a;LCD屏的价格和显示区的尺寸有关&#xff1b; 同点阵的屏&#xff0c;显示区域太小&#xff0c;显示12*1…

AMD在行动:揭示应用程序跟踪和性能分析的力量

AMD in Action: Unveiling the Power of Application Tracing and Profiling — ROCm Blogs 导言 Rocprof是一款强大的工具&#xff0c;设计用于分析和优化基于AMD ROCm平台上运行的HIP程序的性能&#xff0c;帮助开发者找出并解决性能瓶颈。Rocprof提供了多种性能数据&#x…

8.11 矢量图层线要素单一符号使用六(光栅线)

文章目录 前言光栅线&#xff08;Raster Line&#xff09;QGis设置线符号为光栅线&#xff08;Raster Line&#xff09;二次开发代码实现光栅线&#xff08;Raster Line&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中光栅线&#xff08;Raster Line&#xff09;的使…