acwing算法提高之动态规划--树形DP

目录

  • 1 基础知识
  • 2 模板
  • 3 工程化

1 基础知识

暂无。。。

2 模板

暂无。。。

3 工程化

题目1:树的最长路径。

解题思路:遍历从根结点到叶子结点的最长距离和次长距离,注意遍历每一个下一步,因此避免了这两个路径有重叠。更新res,即res = max(res, d1 + d2)。返回最长距离d1

C++代码如下,

#include 
#include 
#include 

using namespace std;

int n;
unordered_map<int, vector<pair<int,int>>> g;

int res = 0;

int dfs(int a, int fa) {
    int d1 = 0;//d1表示最大长度
    int d2 = 0;//d2表示次大长度
    
    for (auto [b,c] : g[a]) {
        if (b == fa) continue;
        int d = dfs(b, a) + c;
        
        if (d >= d1) {
            d2 = d1;
            d1 = d;
        } else if(d > d2) {
            d2 = d;
        }
    }
    
    res = max(res, d1 + d2);
    return d1;
}

int main() {
    cin >> n;
    for (int i = 0; i < n - 1; ++i) {
        int a, b, c;
        cin >> a >> b >> c;
        g[a].emplace_back(b,c);
        g[b].emplace_back(a,c);
    }
    
    dfs(1, -1);
    
    cout << res << endl;
    
    return 0;
}

题目2:树的中心。

解题思路:暴力解法,遍历每一个结点,以该结点为根结点,计算到叶子结点的最长路径。

C++代码如下,

#include 
#include 
#include 

using namespace std;

int n;
unordered_map<int,vector<pair<int,int>>> g;

int dfs(int a, int fa) {
    int d = 0;
    for (auto [b, c] : g[a]) {
        if (b == fa) continue;
        d = max(d, dfs(b, a) + c);
    }
    return d;
}

int main() {
    cin >> n;
    for (int i = 0; i < n - 1; ++i) {
        int a, b, c;
        cin >> a >> b >> c;
        g[a].emplace_back(b,c);
        g[b].emplace_back(a,c);
    }
    
    int res = 0x3f3f3f3f;
    for (int i = 1; i <= n; ++i) {
        res = min(res, dfs(i, -1));
    }
    
    cout << res << endl;
    
    return 0;
}

你可能感兴趣的:(Acwing,C++学习,算法,动态规划)