文巾解题 LCP 07. 传递信息
1 题目描述
2 解题思路
2.1 动态规划
定义动态规划的状态 dp[i][j] 为经过 i 轮传递到编号 j 的玩家的方案数,其中0≤i≤k,0≤j<n。
由于从编号 0 的玩家开始传递,当i=0 时(第0轮),一定位于编号 0 的玩家,不会传递到其他玩家,因此动态规划的边界情况如下:
对于传信息的关系 [src,dst],如果第 i 轮传递到编号 src 的玩家,则第i+1 轮可以从编号 src 的玩家传递到编号dst 的玩家。因此在计算dp[i+1][dst] 时,需要考虑可以传递到编号dst 的所有玩家。
由此可以得到动态规划的状态转移方程,其中0≤i<k:
最终得到dp[k][n−1] 即为总的方案数。
class Solution:def numWays(self, n: int, relation: List[List[int]], k: int) -> int:dp = [[0] * n for _ in range(k + 1)]
#每一轮,从0点出来可以有几条不同的线路到某一个点dp[0][0] = 1
#第0轮(初始情况)只有0点可以到达for i in range(k):for edge in relation:src = edge[0]dst = edge[1]dp[i + 1][dst] += dp[i][src]
#每一轮的情况由上一轮决定return dp[k][n - 1]
上述实现的空间复杂度是 O(kn)。进一步分析可以知道,dp[i][] 的值只和 dp[i−1][] 的值有关。
因此可以将二维数组变成一维数组,将空间复杂度优化到 O(n)。
class Solution:def numWays(self, n: int, relation: List[List[int]], k: int) -> int:dp = [0] * ndp[0] = 1for i in range(k):tmp=[0] * nfor edge in relation:src = edge[0]dst = edge[1]tmp[dst] += dp[src]dp=tmpreturn dp[n - 1]
2.2 深度优先搜索
class Solution:def numWays(self, n: int, relation: List[List[int]], k: int) -> int:dit={}for i in relation:if i[0] in dit:dit[i[0]].append(i[1])else:dit[i[0]]=[i[1]]for i in range(n):if i not in dit:dit[i]=[]
#字典,字典的key为每一个点,value为每一个点可以连接到的点count=0
#经过k轮可以到达n-1的路线数def func(node,k_remain):
#node表示目前从那个点出发
#k_remain表示还剩几条边可以连nonlocal countif(k_remain==0 and node==n-1):count+=1
#如果还有0条边可以连,而且目前到达了n-1点,那么经过k轮可以到达n-1的路线数加一elif(k_remain==0):pass
#否则,就是到了别的点,那么不会有任何情况else:for i in dit[node]:func(i,k_remain-1)
#走到node的邻居那儿去,剩余的边数减一func(0,k)return(count)
2.3 广度优先遍历
class Solution:def numWays(self, n: int, relation: List[List[int]], k: int) -> int:dit={}for i in relation:if i[0] in dit:dit[i[0]].append(i[1])else:dit[i[0]]=[i[1]]for i in range(n):if i not in dit:dit[i]=[]
#和2.2一样,建立一个字典queue=[0]
#建立一个队列,表示经过time轮目前可以到达的点(可以有重复)time=0
#目前已经走了几条边(走了几轮)while(time<k):tmp_size=len(queue)
#当前轮有几个点,一会把他们一个一个弹出队列for _ in range(tmp_size):x=queue.pop(0)queue.extend(dit[x])
#当前轮的点的邻居入队列time+=1return(queue.count(n-1))
#最后就是经过k轮之后,一共可以到达的点。里面有几个n-1,就说明有几条路线到n-1
文巾解题 LCP 07. 传递信息相关推荐
- 文巾解题 LCP 11. 期望个数统计
1 题目描述 2 解题思路 首先,对于不同能力值的人,浏览他们简历的顺序是不会变的,那么我们就看相同能力值的人,两个面试官浏览他们简历的顺序. 我们以小A查看简历的顺序为基准,看小B查看简历的顺序(每 ...
- 【力扣-LeetCode】LCP 07. 传递信息 C++题解
LCP 07. 传递信息 难度简单248收藏分享切换为英文接收动态反馈 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: 有 n 名玩家,所有玩家编号分别为 0 - n-1,其中小朋友 ...
- 文巾解题 面试题 01.04. 回文排列
1 题目描述 2 解题思路 2.1 哈希表 创建一个哈希表,记录每个元素出现的次数.如果出现次数为奇数的元素只有一个或者没有,那么就是一个回文排列 class Solution:def canPerm ...
- 文巾解题 15. 三数之和
1 题目描述 2 解题思路 2.1 使用两数之和函数 这种做法目前超时了,如果大家有想到合适的减时间/剪枝的方法,欢迎私信or评论~ 两数之和的方法见文巾解题 1. 两数之和_刘文巾的博客-CSDN博 ...
- 文巾解题 342. 4的幂
1 题目描述 2 解题思路 2.1 方法1 判断log函数的结果是不是整数 class Solution:def isPowerOfFour(self, n: int) -> bool:if(n ...
- 文巾解题 477. 汉明距离总和
1 题目描述 2 解题思路 2.1 暴力两两比较 两个数字之间的汉明距离可以使用 文巾解题 461. 汉明距离_刘文巾的博客-CSDN博客 中的任何一种方法,但是因为这个是两两比较,时间复杂度比较高, ...
- 文巾解题 1035. 不相交的线
1 题目描述 2 解题思路 k条互不相交的直线分别连接了数组 nums1和nums2的 k 对相等的元素,而且这 k 对相等的元素在两个数组中的相对顺序是一致的,因此,这 k 对相等的元素组成的序列即 ...
- leetcode LCP 07.传递信息
原题 LCP 07.传递信息 题解 方法一 动态规划 动态规划说明某一种状态一定与前一种或者前几种状态有关.我们不妨设立一个二维数组ans,其中ans[j][i]表示的是,从0开始,通过j+1步到达i ...
- LeetCode LCP 07. 传递信息 / NC111 最大数 / NC16 判断二叉树是否对称 / NC13 二叉树的最大深度
祝我党百年华诞生日快乐 LCP 07. 传递信息 2021.7.1 每日一题 题目描述 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 - n-1 ...
最新文章
- apcloud混合式开发app学习笔记
- 转 用户注册及输入框js检测范例(reg.asp)
- oracle 得到一个树,Related to Oracle SQL 关于树形数据的遍历
- 算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述
- PHP与MySQL外文文献译文和原文_读懂外文文献的秘诀在这里丨49周新闻
- vuex commit 模块_长篇连载:Vuex源码学习(二)脉络梳理
- 【Flink】 Flink 源码之 Buffer Timeout优化
- 裘宗燕:C/C++ 语言中的表达式求值
- Monkey软件测试工具介绍
- html 图片分散,纯js和CSS3分散式宝丽来图片画廊
- firebug 调试
- 【PC微信探秘】用易语言编写一个微信DLL注入器
- Zemax操作41--公差分析(一)
- chrome(谷歌浏览器)固定到任务栏,点击之后出现两个图标-原因及解决办法
- 如何改善物流行业项目管理?
- 服务器BMC管理工具ipmitool的安装和使用
- mac卸载了xcode后,运行软件提示:xcode-select: error: invalid developer directory
- 单元格内容分列多行_excel如何将同一个单元格的多行内容拆分
- mysql 导出gtid_mysqldump导出时 --set-gtid-purged=OFF
- 2、Ubuntu介绍加环境搭建详细教程
热门文章
- Node.js 切近实战(八) 之Excel在线(文件权限)
- Oracle将NetBeans交给了Apache基金会
- Bootstrap 输入组
- [置顶] Mybatis技术(二) MyBatis-Spring
- 数据库进阶系列之三:使用Logminer解析Oracle日志
- 人质困境:多个人的囚徒困境(博弈论的诡计)
- 基于python的FFT演示程序
- CSP认证201609-2	火车购票[C++题解]:模拟、vector、排序
- PAT甲级1139 First Contact (30 分):[C++题解] 图论、暴力枚举两个点、hash映射
- net-snmp交叉编译出现 undefined reference to dlopen,dlsym,dlclose错误