博客
关于我
POJ 2486 树形dp
阅读量:803 次
发布时间:2023-03-03

本文共 2155 字,大约阅读时间需要 7 分钟。

从1号点出发,每次经过一个点,可以获取该点上的苹果。目标是通过最多m步,找到能够获取的苹果最大数量。这个问题可以通过动态规划来解决,其中dp[u][j]表示从u号点出发走j步后回到u点能得到的苹果最大数量,而ans[u][j]则表示从u号点出发走j步不一定回到u点能得到的苹果最大数量。

递归关系分析

  • dp[u][j+2]的更新

    • 如果从u走到v,再从v返回u,总共需要2步。因此,dp[u][j+2]可以通过dp[v][k] + dp[u][j-k]来更新,其中k ≤ j,j ≤ m。这表明从v走到u的过程中,可能会经过其他节点。
  • ans[u][j+1]的更新

    • 如果从u走到v,然后直接返回u,则需要2步。ans[u][j+1]可以通过ans[v][k] + dp[u][j-k]来更新。这意味着在走到v之后,可以选择继续走到其他子节点,或者直接返回u。
  • ans[u][j+2]的更新

    • 如果从u走到v,再从v走到另一个子节点w,再返回u,则需要4步。ans[u][j+2]可以通过dp[v][k] + ans[u][j-k]来更新。这表明在走到v之后,可以选择继续走到其他子节点,或者直接返回u。
  • 代码分析

    #include 
    #include
    #include
    using namespace std;struct Edge { int y, next;};void add_edge(int x, int y) { e[k].y = y; e[k].next = first[x]; first[x] = k++;}void dfs(int u, int fa, int m) { ans[u][0] = dp[u][0] = val[u]; for (int i = first[u]; i != -1; i = e[i].next) { int v = e[i].y; if (v == fa) continue; dfs(v, u, m); for (int j = m; j >= 0; j--) { for (int k = j; k >= 0; k--) { dp[u][j + 2] = max(dp[u][j + 2], dp[v][k] + dp[u][j - k]); ans[u][j + 2] = max(dp[v][k] + ans[u][j - k], ans[u][j + 2]); ans[u][j + 1] = max(ans[v][k] + dp[u][j - k], ans[u][j + 1]); } } }}int main() { // 读取输入 int n, m; while (scanf("%d%d", &n, &m) == 2) { for (int i = 1; i <= n; i++) { scanf("%d", val + i); } memset(first, -1, sizeof(first)); k = 0; for (int i = 1; i <= n; i++) { scanf("%d", val + i); // 添加边 while (true) { scanf("%d", &y); if (y == -1) break; add_edge(i, y); } } // 调用dfs dfs(1, -1, m); // 输出结果 for (int i = 1; i <= n; i++) { for (int j = 0; j <= m; j++) { if (j == 0) { cout << val[i] << " "; } else { cout << ans[i][j] << " "; } } cout << endl; } }}

    优化总结

    该代码通过深度优先搜索(DFS)遍历树结构,利用动态规划数组dp和ans来记录从各节点出发的最大苹果数量。递归关系确保了所有可能的路径都被考虑,包括直接返回和经过其他子节点的情况。代码注重正确初始化和更新递归关系,确保了最优解的正确性。

    转载地址:http://lyxfk.baihongyu.com/

    你可能感兴趣的文章
    Python matplotlib 中更换画布背景颜色
    查看>>
    Python进阶03 模块
    查看>>
    python matplotlib简单使用
    查看>>
    Python mock Patch os.environ 和返回值
    查看>>
    Python mock 修补另一个函数调用的函数
    查看>>
    python mqtt 客户端实现
    查看>>
    Python Multiprocessing - 将类方法应用于对象列表
    查看>>
    Python multiprocessing.Queue 与 multiprocessing.manager().Queue()
    查看>>
    Python multiprocessing使用详解
    查看>>
    python mysql 基于 sqlalvhrmy_Python操作MySQL:pymysql和SQLAlchemy
    查看>>
    python mysql 布尔类型_python语言的基础学习:基本类型,函数,面向对象,模块,mysql数据库...
    查看>>
    Python NLP完整项目实战教程(1)
    查看>>
    Python NLP自然语言处理详解
    查看>>
    python nltk nltk_data 离线安装,chatterbot
    查看>>
    Redis 限流的 3 种方式,还有谁不会?
    查看>>
    Python这么慢,为啥大公司还在用?
    查看>>
    python note 06 编码方式
    查看>>
    python numba 转灰度图_使用NumPy、Numba的简单使用(二)
    查看>>
    Python Numpy 关于 linspace()函数 使用详解(全)
    查看>>
    Python numpy插入、读取至postgreSQL数据库中bytea类型字段
    查看>>