文巾解题 LCP 07. 传递信息
生活随笔
收集整理的這篇文章主要介紹了
文巾解题 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. 传递信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python笔记: 生成器
- 下一篇: 数据库笔记: SQL