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. 传递信息相关推荐

  1. 文巾解题 LCP 11. 期望个数统计

    1 题目描述 2 解题思路 首先,对于不同能力值的人,浏览他们简历的顺序是不会变的,那么我们就看相同能力值的人,两个面试官浏览他们简历的顺序. 我们以小A查看简历的顺序为基准,看小B查看简历的顺序(每 ...

  2. 【力扣-LeetCode】LCP 07. 传递信息 C++题解

    LCP 07. 传递信息 难度简单248收藏分享切换为英文接收动态反馈 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: 有 n 名玩家,所有玩家编号分别为 0 - n-1,其中小朋友 ...

  3. 文巾解题 面试题 01.04. 回文排列

    1 题目描述 2 解题思路 2.1 哈希表 创建一个哈希表,记录每个元素出现的次数.如果出现次数为奇数的元素只有一个或者没有,那么就是一个回文排列 class Solution:def canPerm ...

  4. 文巾解题 15. 三数之和

    1 题目描述 2 解题思路 2.1 使用两数之和函数 这种做法目前超时了,如果大家有想到合适的减时间/剪枝的方法,欢迎私信or评论~ 两数之和的方法见文巾解题 1. 两数之和_刘文巾的博客-CSDN博 ...

  5. 文巾解题 342. 4的幂

    1 题目描述 2 解题思路 2.1 方法1 判断log函数的结果是不是整数 class Solution:def isPowerOfFour(self, n: int) -> bool:if(n ...

  6. 文巾解题 477. 汉明距离总和

    1 题目描述 2 解题思路 2.1 暴力两两比较 两个数字之间的汉明距离可以使用 文巾解题 461. 汉明距离_刘文巾的博客-CSDN博客 中的任何一种方法,但是因为这个是两两比较,时间复杂度比较高, ...

  7. 文巾解题 1035. 不相交的线

    1 题目描述 2 解题思路 k条互不相交的直线分别连接了数组 nums1和nums2的 k 对相等的元素,而且这 k 对相等的元素在两个数组中的相对顺序是一致的,因此,这 k 对相等的元素组成的序列即 ...

  8. leetcode LCP 07.传递信息

    原题 LCP 07.传递信息 题解 方法一 动态规划 动态规划说明某一种状态一定与前一种或者前几种状态有关.我们不妨设立一个二维数组ans,其中ans[j][i]表示的是,从0开始,通过j+1步到达i ...

  9. LeetCode LCP 07. 传递信息 / NC111 最大数 / NC16 判断二叉树是否对称 / NC13 二叉树的最大深度

    祝我党百年华诞生日快乐 LCP 07. 传递信息 2021.7.1 每日一题 题目描述 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 - n-1 ...

最新文章

  1. apcloud混合式开发app学习笔记
  2. 转 用户注册及输入框js检测范例(reg.asp)
  3. oracle 得到一个树,Related to Oracle SQL 关于树形数据的遍历
  4. 算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述
  5. PHP与MySQL外文文献译文和原文_读懂外文文献的秘诀在这里丨49周新闻
  6. vuex commit 模块_长篇连载:Vuex源码学习(二)脉络梳理
  7. 【Flink】 Flink 源码之 Buffer Timeout优化
  8. 裘宗燕:C/C++ 语言中的表达式求值
  9. Monkey软件测试工具介绍
  10. html 图片分散,纯js和CSS3分散式宝丽来图片画廊
  11. firebug 调试
  12. 【PC微信探秘】用易语言编写一个微信DLL注入器
  13. Zemax操作41--公差分析(一)
  14. chrome(谷歌浏览器)固定到任务栏,点击之后出现两个图标-原因及解决办法
  15. 如何改善物流行业项目管理?
  16. 服务器BMC管理工具ipmitool的安装和使用
  17. mac卸载了xcode后,运行软件提示:xcode-select: error: invalid developer directory
  18. 单元格内容分列多行_excel如何将同一个单元格的多行内容拆分
  19. mysql 导出gtid_mysqldump导出时 --set-gtid-purged=OFF
  20. 2、Ubuntu介绍加环境搭建详细教程

热门文章

  1. Node.js 切近实战(八) 之Excel在线(文件权限)
  2. Oracle将NetBeans交给了Apache基金会
  3. Bootstrap 输入组
  4. [置顶]       Mybatis技术(二) MyBatis-Spring
  5. 数据库进阶系列之三:使用Logminer解析Oracle日志
  6. 人质困境:多个人的囚徒困境(博弈论的诡计)
  7. 基于python的FFT演示程序
  8. CSP认证201609-2 火车购票[C++题解]:模拟、vector、排序
  9. PAT甲级1139 First Contact (30 分):[C++题解] 图论、暴力枚举两个点、hash映射
  10. net-snmp交叉编译出现 undefined reference to dlopen,dlsym,dlclose错误