LCP 07. 传递信息
LCP 07. 传递信息
法1:dfs
若步数cnt超过了 k 且没有到达 终点 则剪枝,若步数为k且到达终点则方案+1.
const int M = 110,N = 12;
int h[N],ne[M],e[M],idx,ans;
class Solution {
public:
void add(int a,int b){e[idx] = b;ne[idx] = h[a];h[a] = idx++;}
void dfs(int index, int cnt, int n, int k){
for(int i = h[index]; ~i; i = ne[i]){
int j = e[i];
if(cnt == k - 1){
if(j == n - 1)ans ++;
continue;
}
dfs(j,cnt + 1, n, k);
}
}
int numWays(int n, vector<vector<int>>& relation, int k) {
ans = idx = 0;
memset(h,-1,sizeof h);
for(auto& c : relation)add(c[0],c[1]);
dfs(0, 0, n, k);
return ans;
}
};
法2:dp
\(f[i][j]\) 表示走了\(i\)步,到达\(j\)点的方案数,则\(f[i][j]\) 应是所有能够到达位置 \(j\) 的点 \(p\) 的\(f[i - 1][p]\) 求和.
状态转移方程:\(f[i][j] = \sum f[i-1][p], \forall p 满足 relation[i][0] = p, relation[i][1] = j;\)
为了方便实现,具体细节见下方代码。
class Solution {
public:
int numWays(int n, vector<vector<int>>& relation, int k) {
vector<vector<int>>f(k + 1,vector<int>(n + 1));
f[0][0] = 1;
for(int i = 1;i <= k; ++i)
for(auto& c : relation)
f[i][c[1]] += f[i - 1][c[0]];
return f[k][n - 1];
}
};