問題描述
小朋友 a 在和 ta 的小夥伴們玩傳資訊遊戲,遊戲規則如下:
有 n 名玩家,所有玩家編號分別為 0 ~ n-1,其中小朋友 a 的編號為 0
每個玩家都有固定的若干個可傳資訊的其他玩家(也可能沒有)。傳資訊的關係是單向的(比如 a 可以向 b 傳資訊,但 b 不能向 a 傳資訊)。
每輪資訊必須需要傳遞給另乙個人,且資訊可重複經過同乙個人
給定總玩家數 n,以及按 [玩家編號,對應可傳遞玩家編號] 關係組成的二維陣列 relation。返回資訊從小 a (編號 0 ) 經過 k 輪傳遞到編號為 n-1 的小夥伴處的方案數;若不能到達,返回 0。
示例 1:
輸入:n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3
輸出:3
解釋:資訊從小 a 編號 0 處開始,經 3 輪傳遞,到達編號 4。共有 3 種方案,分別是 0->2->0->4, 0->2->1->4, 0->2->3->4。
示例 2:
輸入:n = 3, relation = [[0,2],[2,1]], k = 2
輸出:0
解釋:資訊不能從小 a 處經過 2 輪傳遞到編號 2
限制:2 <= n <= 10
1 <= k <= 5
1 <= relation.length <= 90, 且 relation[i].length == 2
0 <= relation[i][0],relation[i][1] < n 且 relation[i][0] != relation[i][1]
問題分析:
dfs:將孩子們的傳遞的關係圖畫出來,可知只是乙個關於圖的問題,問題轉換為從圖中的節點0經過k個節點到達節點n-1。因此也就是乙個搜尋問題,因此使用dfs進行搜尋。再次轉換,也就是在一棵樹中進行搜尋,深度不大於k且此時的節點應該為n-1.
動態規劃:計數型dp
1.確定狀態:
最後一步:在到達n-1之前,前一步一定在0…n-2之間
子問題:走k-1步能夠到達0…n-2中任意乙個的方法數,他們的和就是總數量
定義狀態dp[k][n]為走k-1步到達n-1的方法數量
2.定義狀態轉移方程
dp[k][n]=sum(dp[k-1][0]+dp[k-1][1]+…+dp[k-1][n-2]+dp[k-1][n-1])
3.初始值和邊界條件
初始值:dp[0][0]=1,走0步到達0節點的方法為1
邊界條件:k,n
4.優化
偽**:
int dfs()
for(
int i=
0;i++i)
dfs(relation,relationsize,n,k-
1,dst[i]);
return ans;
}int
numways
(int n,
int*
*relation,
int relationsize,
int*relationcolsize,
int k)
//dp
intnumways
(int n,
int*
*relation,
int relationsize,
int*relationcolsize,
int k)
元件間傳遞資訊
父元件到子元件通訊 1 prop 父子元件 父子通訊中最常見的資料傳遞方式就是通過props傳遞資料,就好像方法的傳參一樣,父元件呼叫子元件並傳入資料,子元件接受到父元件傳遞的資料進行驗證使用 props 可以是陣列或物件,用於接收來自父元件的資料。props 可以是簡單的陣列,或者使用物件作為替代...
iframe父子傳遞資訊
1.子向父通訊 parent.html window.addeventlistener message function e child.html window.parent.postmessage 2.父向子通訊 parent.html var myframe document.getelemen...
C 視窗傳遞資訊
方法1 在form1中通過postmessage傳送訊息,在form2通過defwndproc截獲訊息來相互作用,具體參見我先前的文章 c 收發和處理自定義的windows訊息 方法2通過第三方 公共類的公共靜態成員來實現 class class1 在form1中賦值class1.str 傳入的內容...