博客
关于我
POJ 2486 树形dp
阅读量:793 次
发布时间: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/

    你可能感兴趣的文章
    RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型
    查看>>
    php数组函数分析--array_column
    查看>>
    php数组实现:哈希 +双向链表
    查看>>
    PHP数组排序函数array_multisort()函数详解(二)
    查看>>
    php数组的几个函数和超全局变量
    查看>>
    PHP文件锁
    查看>>
    php文本框输入制定文本,php – 当用户没有向文本框输入任何内容时...
    查看>>
    PHP时间戳和日期相互转换操作总结
    查看>>
    php时间戳知识点,php 时间戳函数总结与示例
    查看>>
    php更新数据库失败,php – 无法更新MySQL数据库
    查看>>
    php机器人聊天对话框,基于AIML的PHP聊天机器人
    查看>>
    PHP查找数组中最大值与最小值
    查看>>
    php查最大值,在PHP数组中查找最大值
    查看>>
    php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
    查看>>
    php根据年月日计算年龄
    查看>>
    RabbitMQ - 单机部署(超详细)
    查看>>
    php检查注册,PHP检查注册的电子邮件地址是一个’school.edu’地址
    查看>>
    php模拟发送GET和POST请求
    查看>>
    RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo
    查看>>
    php模板引擎smarty
    查看>>