当前位置: 首页 > wzjs >正文

南平建设企业网站做移动网站优化排

南平建设企业网站,做移动网站优化排,网站的几种提交方式,网站优化团队小蓝正在和朋友们团建,有一个游戏项目需要两人合作,两个人分别拿到一棵大小为 n 和 m 的树,树上的每个结点上有一个正整数权值 c 1 , c 2 , ⋅ ⋅ ⋅ , c n c_1, c_2, , c_n c1​,c2​,⋅⋅⋅,cn​, d 1 , d 2 , ⋅ ⋅ ⋅ , d m d_1, d_…

小蓝正在和朋友们团建,有一个游戏项目需要两人合作,两个人分别拿到一棵大小为 n 和 m 的树,树上的每个结点上有一个正整数权值 c 1 , c 2 , ⋅ ⋅ ⋅ , c n c_1, c_2, · · · , c_n c1,c2,⋅⋅⋅,cn, d 1 , d 2 , ⋅ ⋅ ⋅ , d m d_1, d_2, · · · , d_m d1,d2,⋅⋅⋅,dm。两个人需要从各自树的根结点 1 出发走向某个叶结点,从根到这个叶结点的路径上经过的所有结点上的权值构成了一个正整数序列,两人的序列的最长公共前缀即为他们的得分。给出两棵树,请计算两个人最多的得分是多少。

问题分析

输入:

  • 两棵树的节点权值数组 c 和 d,分别表示第一棵树和第二棵树的节点权值。
  • 树的节点编号从 1 到 n(或 m),根节点是 1。
  • 树的结构通过邻接表表示。

目标:
从根节点到叶节点的路径中,找到两棵树路径序列的最长公共前缀(LCP)。

方法:

  • 使用深度优先搜索(DFS)遍历两棵树,生成所有从根节点到叶节点的路径。
  • 对于每对路径,计算它们的最长公共前缀。
  • 找到所有路径对中的最大 LCP。

示例

// 示例输入
vector<int> c = {1, 2, 3, 4, 5, 6}; // 第一棵树的节点权值
vector<int> d = {1, 2, 3, 4, 7, 6}; // 第二棵树的节点权值// 第一棵树的邻接表
vector<vector<int>> tree1 = {{},          // 节点 0(未使用){2, 3},      // 节点 1 的子节点{4, 5},      // 节点 2 的子节点{6},         // 节点 3 的子节点{},          // 节点 4{},          // 节点 5{}           // 节点 6
};// 第二棵树的邻接表
vector<vector<int>> tree2 = {{},          // 节点 0(未使用){2, 3},      // 节点 1 的子节点{4, 7},      // 节点 2 的子节点{6},         // 节点 3 的子节点{},          // 节点 4{},          // 节点 5{},          // 节点 6{}           // 节点 7
};

解题思路

  • DFS 函数
    • 使用递归实现深度优先搜索,生成从根节点到叶节点的所有路径。
    • 路径存储在 paths 中。
  • 最长公共前缀函数
    • 比较两个路径序列的节点权值,找到最长公共前缀的长度。
  • 最大得分函数
    • 生成两棵树的所有路径。
    • 遍历所有路径对,计算它们的 LCP,并找到最大值。
  • 主函数
    • 定义树的邻接表和节点权值数组。
    • 调用 maxScore 函数计算最大得分。

C++实现

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;// 生成从根节点到叶节点的所有路径
void dfs(int node, vector<int>& path, vector<vector<int>>& paths, const vector<vector<int>>& tree) {path.push_back(node); // 将当前节点加入路径if (tree[node].empty()) { // 如果是叶节点paths.push_back(path); // 将当前路径加入结果} else {for (int child : tree[node]) { // 遍历子节点dfs(child, path, paths, tree);}}path.pop_back(); // 回溯
}// 计算两个序列的最长公共前缀长度
int longestCommonPrefix(const vector<int>& seq1, const vector<int>& seq2, const vector<int>& c, const vector<int>& d) {int len = min(seq1.size(), seq2.size());for (int i = 0; i < len; i++) {if (c[seq1[i] - 1] != d[seq2[i] - 1]) { // 比较权值return i;}}return len;
}// 计算最大得分
int maxScore(const vector<vector<int>>& tree1, const vector<vector<int>>& tree2, const vector<int>& c, const vector<int>& d) {// 生成第一棵树的所有路径vector<vector<int>> paths1;vector<int> path1;dfs(1, path1, paths1, tree1);// 生成第二棵树的所有路径vector<vector<int>> paths2;vector<int> path2;dfs(1, path2, paths2, tree2);// 计算所有路径对的最长公共前缀int maxLCP = 0;for (const auto& p1 : paths1) {for (const auto& p2 : paths2) {int lcp = longestCommonPrefix(p1, p2, c, d);maxLCP = max(maxLCP, lcp);}}return maxLCP;
}

复杂度分析

  • 时间复杂度
    • 生成路径: O ( N + M ) O(N+M) O(N+M),其中 N N N M M M 分别是两棵树的节点数。
    • 计算 LCP: O ( P 1 × P 2 × L ) O(P _1×P_2 ×L) O(P1×P2×L),其中 P 1 P_1 P1 P 2 P_2 P2 是路径数,L 是路径的平均长度。
  • 空间复杂度
    • 存储路径: O ( P 1 × L + P 2 × L ) O(P_1 ×L+P_2 ×L) O(P1×L+P2×L)

总结

  • 通过 DFS 遍历生成路径,结合 LCP 计算,可以高效地解决这个问题。
  • 代码实现清晰,逻辑简单,适用于树结构的问题。
  • 该方法的复杂度在合理范围内,能够处理中等规模的输入。
http://www.dtcms.com/wzjs/806560.html

相关文章:

  • 柳州企业做网站上传网站安装教程视频
  • 做网站是不是要域名费中国企业500强最新排名名单
  • 农业网站模板WordPress如何做网站流量统计
  • 梅州免费建站公司软装
  • 餐饮技术支持东莞网站建设想做苗木生意网站怎么怎么做
  • 外贸网站源码哪个好企业做网站需要的资料
  • 网站编程培训机构自己组装电脑做网站服务器
  • wordpress 手机 自建站响应式网站手机端
  • 专业的网站建设电话杏坛餐饮网站建站
  • 怎么健免费网站吗太原建设网站
  • 鹤岗做网站搜狗网站推广
  • 做论坛网站如何赚钱招聘网官网
  • 网页登录惠州seo
  • 网站开发费用怎么入账wordpress网站底部导航代码
  • 长春企业公司网站建设个人备案网站名称怎么写
  • 网站推广平台排行今科网站建设公司
  • 做网站常规语言自动城市定位装修网站建设
  • 商务网站建设的一般流程是什么?wordpress宝塔优化
  • 广州 创意的网站设计wordpress付费附件下载
  • 如何知道网站什么时候做的深圳附近做个商城网站多少钱
  • 公司做网站能够带来的好处排名好的移动网站建设
  • 微信网站开发服务建设银行成都 招聘网站
  • 免费建立网站的有哪里一级A做爰片安全网站
  • 五种常见的软件架构东莞seo网络培训
  • 专门做网站推广的平台海南百度首页广告
  • 惠州哪个房地产网站做的比较好拼多多关键词排名查询工具
  • 阿里云服务器做盗版电影网站wordpress自动生成百度地图
  • 自己可以做网站吗商丘哪里教做网站的
  • 新闻类的网站如何做优化、网站后台模板免费下载
  • 自己做网站可以赚钱吗网站怎么找的