日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

文巾解题 LCP 07. 传递信息

發布時間:2025/4/5 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文巾解题 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. 传递信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。