news 2026/4/5 19:20:54

邻接矩阵练习1--------LCP 07.传递信息

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
邻接矩阵练习1--------LCP 07.传递信息

前言

当我把手机的时间根据自己的起床时间调整以后,一切都变得奇妙起来了,我感觉这样真的蛮神圣的,先试试再说。

题目:点这里

解法

class Solution { public: int matrix[10][10]; // memset(matrix,0,sizeof(matrix)); int N; // int sum; int dfs(int u,int k){ if(k==0){ if(u==N-1){ return 1; }else{ return 0; } } int sum=0;//问题1 for(int i=0;i<N;i++){ if(matrix[u][i]){ sum += dfs(i,k-1); } } return sum; } int numWays(int n, vector<vector<int>>& relation, int k) { memset(matrix,0,sizeof(matrix)); N = n; // sum=0; //问题2 for(int i=0;i<relation.size();i++){//relation.size()不是n matrix[relation[i][0]][relation[i][1]]=1; } return dfs(0,k); } };

这个题目的思路就是,首先将题目中边表示法的数组转化成邻接矩阵表示法的数组,然后利用递归深度优先搜索,寻找每一种可行的方案,最终得到总和。

反思

做题过程中出现了四个主要问题,

1.由于对邻接矩阵的不熟悉,就直接把边表示法的数组当作邻接矩阵来使用,导致出错;

2.sum作为最终存储总和的变量,声明的位置很重要,应该放在递归函数的内部,因为它每次只负责将本层的所有情况进行累加,然后将总和返回给上一层,在返回之前,上一层的sum还是0,所以每一层的sum是独立的,不同的;

3.在numWays函数内部,for循环的目的是将边表示法的数组转化成邻接矩阵的数组,所以循环的终止条件应该是基于边表示法的数组,也就是关系数,有多少个关系,就进行多少次赋值;

4.memset函数是用来给matrix数组初始化清零的,应该放在函数内部而不是类内涵数外,因为根据规则,类内部只能包含变量的声明和函数的定义,而初始化清零属于执行语句,只能放在函数内部。

记忆化搜素解法

class Solution { public: int matrix[10][10]; int N; // memo[u][k] 表示:当前在 u 点,还剩 k 步时,有多少种到达终点的方案 int memo[10][10]; int dfs(int u, int k) { // 1. 查表:如果这个状态之前算过(不等于 -1),直接返回缓存的结果 if (memo[u][k] != -1) { return memo[u][k]; } if (k == 0) { // 结果只有 1 或 0,不需要缓存(或者也可以缓存,看个人习惯) return u == N - 1 ? 1 : 0; } int sum = 0; for (int i = 0; i < N; i++) { if (matrix[u][i]) { sum += dfs(i, k - 1); } } // 2. 记录:在返回 sum 之前,先把它记在小本本上 memo[u][k] = sum; return sum; } int numWays(int n, vector<vector<int>>& relation, int k) { memset(matrix, 0, sizeof(matrix)); // 重要:把备忘录全部初始化为 -1 memset(memo, -1, sizeof(memo)); N = n; for (int i = 0; i < relation.size(); i++) { matrix[relation[i][0]][relation[i][1]] = 1; } return dfs(0, k); } };

动态规划

class Solution { public: int numWays(int n, vector<vector<int>>& relation, int k) { // dp[i][j]:第 i 轮传递给编号 j 的人的方案数 // 数组大小开大一点点防止越界 vector<vector<int>> dp(k + 1, vector<int>(n, 0)); // 初始化:第 0 轮,我们在起点 0,只有 1 种方案 dp[0][0] = 1; // 开始一轮轮传递,直到第 k 轮 for (int i = 0; i < k; i++) { // 遍历所有的传递关系(边) for (auto& edge : relation) { int src = edge[0]; // 发送者 int dst = edge[1]; // 接收者 // 核心公式: // 如果第 i 轮能到达 src,那么第 i+1 轮就能从 src 到达 dst // 所以要把 src 的方案数累加给 dst dp[i + 1][dst] += dp[i][src]; } } // 最后返回:第 k 轮到达 n-1 号玩家的方案数 return dp[k][n - 1]; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 20:53:21

教育场景应用:用BSHM做在线课程形象优化

教育场景应用&#xff1a;用BSHM做在线课程形象优化 在线教育已经从“能上课”进入“上好课”的新阶段。老师们不再满足于简单露脸直播&#xff0c;而是希望呈现更专业、更沉浸、更富表现力的授课形象——背景干净不杂乱、人像边缘自然无毛边、画面清爽有质感。但传统抠图工具…

作者头像 李华
网站建设 2026/4/4 16:16:56

Z-Image-Turbo_UI界面输出路径在哪?一看就懂

Z-Image-Turbo_UI界面输出路径在哪&#xff1f;一看就懂 你刚跑通 Z-Image-Turbo 的 UI 界面&#xff0c;输入提示词、点下生成按钮&#xff0c;画面一闪——图片出来了&#xff01;但下一秒问题来了&#xff1a;这张图存在哪儿了&#xff1f;怎么找&#xff1f;怎么批量导出&…

作者头像 李华
网站建设 2026/3/30 10:06:27

Sunshine完全指南:从设备限制到跨屏游戏的5个突破

Sunshine完全指南&#xff1a;从设备限制到跨屏游戏的5个突破 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器&#xff0c;支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine …

作者头像 李华
网站建设 2026/4/3 4:12:42

YOLO11开源社区指南:贡献代码与部署经验分享

YOLO11开源社区指南&#xff1a;贡献代码与部署经验分享 YOLO11并不是当前主流计算机视觉领域中官方发布的模型版本。截至2024年&#xff0c;Ultralytics官方维护的YOLO系列最新稳定版为YOLOv8&#xff0c;后续演进版本&#xff08;如YOLOv9、YOLOv10&#xff09;由不同研究团…

作者头像 李华
网站建设 2026/3/26 2:47:04

Matplotlib图形绘制技巧:无弹窗显示

在使用Matplotlib进行数据可视化时,我们经常需要创建多个子图并在其上绘制数据。然而,当你调用axes()函数时,可能会遇到图形窗口自动弹出的问题。这不仅影响工作效率,而且在需要处理大量图形时尤为不便。今天我们将探讨如何在Matplotlib中创建子图并避免图形窗口自动弹出,…

作者头像 李华
网站建设 2026/4/4 20:39:21

全新Nucleus Co-Op分屏多人游戏完全指南:从安装到精通

全新Nucleus Co-Op分屏多人游戏完全指南&#xff1a;从安装到精通 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop Nucleus Co-Op是一款革命性的开源…

作者头像 李华