博客
关于我
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/

    你可能感兴趣的文章
    PyMongo按多个关键点分组
    查看>>
    Pympress:强大的双屏PDF阅读器
    查看>>
    pymysql.err.InternalError: (1054, "Unknown column '27D24A3B' in 'where clause'")之错误解决
    查看>>
    pymysql.err.OperationalError: (1364, “Field ‘id‘ doesn‘t have a default value“)
    查看>>
    Pytorch Tensor 维度操作的形象理解 Tensor.unsqueeze() Tensor.squeeze()
    查看>>
    PyMySQL库对Mysql数据库进行增删改查与工具类封装
    查看>>
    pynput的基本介绍和使用
    查看>>
    pyodbc 通过 IIS7 连接到 MSSQL 2005 服务器
    查看>>
    PyPI 存储库中的 JarkaStealer:深入解析与防范措施
    查看>>
    Pyplot tutorial,Pyplot官方教程自翻译
    查看>>
    PyQ5学习笔记——使用内部槽函数关闭窗口
    查看>>
    PyQ5学习笔记——使用自定义槽函数关闭窗口
    查看>>
    PyQt MimeData 文件名
    查看>>
    PyQt QML Material Design 按钮背景不会改变
    查看>>
    PyQt QString转成python stirng
    查看>>
    PyQt QToolButton在焦点时不更新图标
    查看>>
    PyQt 正确使用 emit() 和 pyqtSignal()
    查看>>
    PyQT-将文件复制到剪贴板
    查看>>
    PYQT.如何在QTableView中插入小部件
    查看>>
    PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用
    查看>>