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

文章目录

    • 引言
    • 复习
      • 树形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]);}elsefor (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.mzph.cn/bicheng/25988.shtml

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

相关文章

Linux 安装ab测试工具

yum -y install httpd-tools ab -help #10个并发连接&#xff0c;100个请求 ab -n 200 -c 100 http://www.baidu.com/

基于51单片机的车辆动态称重系统设计

一 动态称重 所谓动态称重是指通过分析和测量车胎运动中的力,来计算该运动车辆的总重量、轴重、轮重和部分重量数据的过程。动态称重系统按经过车辆行驶的速度划分,可分为低速动态称重系统与高速动态称重系统。因为我国高速公路的限速最高是120,所以高速动态称重系统在理论…

【Rd-03E】使用CH340给Rd03_E雷达模块烧录固件

Rd03_E 指导手册 安信可新品雷达模组Rd-03搭配STM32制作简易人体感应雷达灯教程 http://t.csdnimg.cn/mqhkE 测距指导手册网址&#xff1a; https://docs.ai-thinker.com/_media/rd-03e%E7%B2%BE%E5%87%86%E6%B5%8B%E8%B7%9D%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C%E4%B8%AD%…

万能表单与AI的完美融合,打造个性化AI小程序

在人工智能技术日益成熟的今天&#xff0c;如何将AI智能与用户界面无缝结合&#xff0c;已成为软件开发领域的新挑战。MyCms 以其创新的“万能表单结合AI”功能&#xff0c;为开发者提供了一个全新的解决方案&#xff0c;让个性化AI小程序的开发变得前所未有的简单和高效。 一、…

【解读】小提琴图

ref&#xff1a;解读文献中的箱线图&#xff08;Box-plot&#xff09;和小提琴图&#xff08;Violin-plot)&#xff09;_小提琴图和箱线图的区别-CSDN博客小提琴图展示了每个变量的数据分布情况&#xff0c;通过图中的“小提琴”形状可以看出数据的密度和分布情况。 在图中&…

2024-6-10-Model-Agnostic Meta-Learning (MAML)

摘自&#xff1a;Meta-Transfer Learning for Zero-Shot Super-Resolution 近年来&#xff0c;提出了各种元学习算法。它们可以分为三类&#xff1a; 基于度量的方法&#xff1a;这些方法通过学习度量空间&#xff0c;使得在少量样本内进行高效的学习。例如[35, 38, 39]。基于…

ElasticSearch聚合方式

聚合方式 ES支持灵活的聚合方式,它不仅支持聚合和查询相结合,而且还可以使聚合的过滤条件不影响搜索条件,并且还支持在聚合后的结果中进行过滤筛选。 1.1 直接聚合 直接聚合指的是聚合时的DSL中国没有query子句,是直接对索引内的所有文档进行聚合。 比如下面的DSL: 1.2 先…

入门级的卷积神经网络训练识别手写数字-小白轻松上手-含数据集+pyqt界面

代码下载地址&#xff1a; https://download.csdn.net/download/qq_34904125/89374845 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文…

苹果WWDC大会AI亮点:大揭晓

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Java网络通信实现

UDP UDPServer import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket;public class UDPServer {public static void main(String[] args) throws IOException {System.out.println("UdpServer启动");// 创建upd套接字Data…

两台电脑通过网线直连共享数据(超详细)- 我的实践记录

原文链接 按照原文的操作&#xff0c;成功通过直连网线连接了两台windows电脑并共享传输数据。 ping不通可能是防火墙没关闭导致的&#xff0c;但是完全关闭防火墙又不安全。 那么有没有不关闭防火墙&#xff0c;能够上网&#xff0c;又能直连另一台电脑呢&#xff1f; 我们…

拓扑排序-java

主要通过宽度优先搜索&#xff08;BFS&#xff09;来实现有向无环图的拓扑序列&#xff0c;邻接表存储图。数组模拟单链表、队列&#xff0c;实现BFS基本操作。 文章目录 前言 一、有向图的拓扑序列 二、算法思路 1.拓扑序列 2.算法思路 三、使用步骤 1.代码如下&#xff08;示…

QT 使用资源文件的注意点

不要存放没有使用的资源文件 即使在代码中没有使用到的资源文件&#xff0c;也会编译到执行文件或者DLL里面去这样会增大它的体积。如下 在代码没有使用这个资源文件(10.4M的2k图片)&#xff0c;但是编译出来的程序有 12M左右的大小 1 假设我们有一个比较复杂的项目&#…

ReentrantLock底层原理

ReentrantLock public ReentrantLock() {sync new NonfairSync(); }public ReentrantLock(boolean fair) {sync fair ? new FairSync() : new NonfairSync(); }ReentrantLock 的默认实现是非公平锁&#xff0c;实际上 ReentrantLock 中的方法&#xff0c;几乎都让 sync 实现…

springboot高校运动会信息管理系统设计与实现-计算机毕业设计源码92968

摘 要 本论文介绍了一个高校运动会信息管理系统的设计和实现过程。首先是高校运动会的需求分析和可行性分析&#xff0c;通过比较运动会的各个工作流程&#xff0c;确定了系统的数据流程和数据库结构&#xff0c;然后介绍了高校运动会信息管理系统开发所使用的软件开发工具&…

Java实现数据结构——顺序表

目录 一、前言 二、实现 2.1 增 2.2 删 2.3 查 2.4 改 2.5 销毁顺序表 三、Arraylist 3.1 构造方法 3.2 常用操作 3.3 ArrayList遍历 四、 ArrayList具体使用 4.1 杨辉三角 4.2 简单洗牌算法 一、前言 笔者在以前的文章中实现过顺序表 本文在理论上不会有太详细…

vscode侧边栏错乱重制

vscode 重制命令面板 View: Reset View Locations

三星系统因何而成?或许是因为吞噬了第四颗恒星

相比于其他的类似星体&#xff0c;这个特殊的三星系统拥有更大更紧密的星体。 三星 天文学家发现了前所未见的三星系统。相比于其他典型的三星系统&#xff0c;这一三星系统拥有更大的体积&#xff0c;并且排列也更加紧密&#xff0c;这也使得这一系统更加特别。科学家推测&am…

【题解】—— LeetCode一周小结23

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结22 3.分糖果 II 题目链接&#xff1a;1103. 分糖果 II 排排坐…

MySQL-数据处理(1)

029-数据处理函数之获取字符串长度 select length(我是Cupid); select char_length(我是Cupid);concat (concatenate) select concat(cu, pid, so, handsome);030-去除字符串前后空白-trim select trim( a b c );select trim(leading 0 from 000110); select t…