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];
    }
};
posted @ 2021-07-01 18:58  Ivessas  阅读(55)  评论(0)    收藏  举报