• 力扣370周赛 -- 第三题(树形DP)


    该题的方法,也有点背包的意思,如果一些不懂的朋友,可以从背包的角度去理解该树形DP

    问题

    题解主要在注释里

             //该题是背包问题+树形dp问题的结合版,在树上解决背包问题

             //背包问题就是选或不选当前物品

             //本题求的是最大分数

             //先转成背包问题理解

             //从n个物品当中选出最大分数

             //再转成有限制版的

             //从n个物品当中选出最大分数,并且血量是健康的

             //再转成树形DP去理解该问题

             

             //树是健康就是,在任意一条树的路径下(到叶子节点的任意一条路径),能确保至少有一个物品不被选

             //从树上前n个物品当中选出一些物品,并且保证树是健康的

             //从树上前i个物品当中选出保证树是健康的前提下,能选出的不超过i个物品的最大分数

             //然后再去拓展这个定义

             

             //结合树形DP的经验

             //以当前u为根节点的子树,在保证树是健康的前提下,能选出的最大分数

             //那么就有了推导过程,从下往上推导,也就是从最小子树往上推导到最大子树最大分数

             //那么最好的做法就是利用递归的特性,回溯的时候进行推导

             //这题中我们直接找出最大分数,其实是比较难的,我们用初中的思想

             //正难则反,既然找最大分数(有个不选的)比较难,那么我们可以用

             //找个最小分数(选上的),那么就变得比较简单了

             

             //状态定义

             //首先我们找最小的,以树形dp为经验推导出

             //我们以u为根节点的子树,总和最小的分数(并且是保证健康的,在一条路径上最少也得选一个)

             //定义为min_val[u]

                   

             //那么怎么算出最大分数呢,既然有min_val[u],那么就有,以当前u为根节点的子树节点总和sum_val[u]

             //那么相减sum_val[u] - min_val[u]就等于最大分数了

             

             //那么如何推导这两个定义的数组呢?

             //树形dp类型问题,最好首先用dfs,边回溯边推导数组

    1. class Solution {
    2. public:
    3. void dfs_sum_val(int u,int fa,vector<int>& val,vectorint>>& g,vector<long long>& sum_val)
    4. {
    5. sum_val[u] = val[u];
    6. for(auto e:g[u])
    7. if(fa != e)//不要往上计算,我们是从下往上推导,并且可以保证不会无限递归
    8. {
    9. dfs_sum_val(e,u,val,g,sum_val);
    10. //回溯计算
    11. sum_val[u] += sum_val[e];
    12. }
    13. //这个dfs我们可以算作一个小题,就是计算出每个点为根节点的子树的总和
    14. }
    15. void dfs_min_val(int u,int fa,vector<int>& val,vectorint>>& g,vector<long long>& min_val)
    16. {
    17. long long min_res = 0;
    18. min_val[u] = (long long)val[u];//只有一个节点的时候必选
    19. for(auto& e:g[u])
    20. {
    21. if(fa != e)
    22. {
    23. dfs_min_val(e,u,val,g,min_val);
    24. min_res += min_val[e];
    25. }
    26. }
    27. if(min_res) min_val[u] = min((long long)min_val[u],min_res);
    28. //怎么选最小的分数呢,当前根节点选,那么子节点可以不选,当前根节点不选,那么子节点都要选
    29. //从下往上推导
    30. }
    31. long long maximumScoreAfterOperations(vectorint>>& edges, vector<int>& values)
    32. {
    33. //该题是背包问题+树形dp问题的结合版,在树上解决背包问题
    34. //背包问题就是选或不选当前物品
    35. //本题求的是最大分数
    36. //先转成背包问题理解
    37. //从n个物品当中选出最大分数
    38. //再转成有限制版的
    39. //从n个物品当中选出最大分数,并且血量是健康的
    40. //再转成树形DP去理解该问题
    41. //树是健康就是,在任意一条树的路径下(到叶子节点的任意一条路径),能确保至少有一个物品不被选
    42. //从树上前n个物品当中选出一些物品,并且保证树是健康的
    43. //从树上前i个物品当中选出保证树是健康的前提下,能选出的不超过i个物品的最大分数
    44. //然后再去拓展这个定义
    45. //结合树形DP的经验
    46. //以当前u为根节点的子树,在保证树是健康的前提下,能选出的最大分数
    47. //那么就有了推导过程,从下往上推导,也就是从最小子树往上推导到最大子树最大分数
    48. //那么最好的做法就是利用递归的特性,回溯的时候进行推导
    49. //这题中我们直接找出最大分数,其实是比较难的,我们用初中的思想
    50. //正难则反,既然找最大分数(有个不选的)比较难,那么我们可以用
    51. //找个最小分数(选上的),那么就变得比较简单了
    52. //状态定义
    53. //首先我们找最小的,以树形dp为经验推导出
    54. //我们以u为根节点的子树,总和最小的分数(并且是保证健康的,在一条路径上最少也得选一个)
    55. //定义为min_val[u]
    56. //那么怎么算出最大分数呢,既然有min_val[u],那么就有,以当前u为根节点的子树节点总和sum_val[u]
    57. //那么相减sum_val[u] - min_val[u]就等于最大分数了
    58. //那么如何推导这两个定义的数组呢?
    59. //树形dp类型问题,最好首先用dfs,边回溯边推导数组
    60. int edge_size = edges.size();
    61. vectorint>> g(values.size() + 110);
    62. for(int i = 0;i < edge_size;i++)
    63. {
    64. int a = edges[i][0];
    65. int b = edges[i][1];
    66. g[a].push_back(b);
    67. g[b].push_back(a);
    68. }
    69. vector<long long> sum_val(21000);
    70. vector<long long> min_val(21000,0x3f3f3f3f);
    71. //预处理出来sum_val数组
    72. dfs_sum_val(0,-1,values,g,sum_val);
    73. //预处理出来min_val数组
    74. dfs_min_val(0,-1,values,g,min_val);
    75. return sum_val[0] - min_val[0];
    76. }
    77. };

  • 相关阅读:
    TRex学习之旅九
    南大通用GBase8s 常用SQL语句(255)
    孙卫琴的《精通Vue.js》读书笔记-注册全局组件和局部组件
    【前端升全栈】 五分钟了解Node.js
    typora使用picgo拖拽复制自动上传到chevereto私有图床(mac版)
    PostMan测试接口-----上传文件、导出excel
    ES6 不完全手册(上)
    [力扣] 剑指 Offer 第二天 - 复杂链表的复制
    如何使用 ABAP 创建包含不同字体大小的 Word 文档
    多模态大语言模型综述
  • 原文地址:https://blog.csdn.net/txh1873749380/article/details/134255097