当前位置: 首页 > news >正文

新网站做百度推广 收录seo网上培训多少钱

新网站做百度推广 收录,seo网上培训多少钱,建设银行官方网站认证,网站建设的步骤教学目录 树状动态规划概述 示例 求解思路 树状动态规划概述 树状动态规划(Tree DP)是一种在树结构上进行动态规划的方法。在树状DP中,我们利用树的特殊结构性质,通过递归地向下更新子节点的状态,最终得到整个树的最…

目录

树状动态规划概述

示例 

求解思路 


树状动态规划概述

树状动态规划(Tree DP)是一种在树结构上进行动态规划的方法。在树状DP中,我们利用树的特殊结构性质,通过递归地向下更新子节点的状态,最终得到整个树的最优解或其他需要的信息。

树状DP通常包含以下步骤:

  1. 定义状态:根据问题的要求,定义每个节点的状态。这可以是一个数值、一个数组、一个结构体等,取决于问题的具体情况。
  2. 设计转移方程:根据问题的要求,确定每个节点的状态如何从其子节点的状态转移而来。这通常通过遍历节点的子节点,并利用子节点的状态来更新当前节点的状态来实现。
  3. 确定初始状态:确定叶节点的初始状态,这是递归的终止条件。
  4. 递归地进行状态转移:从树的顶部开始,递归地向下进行状态转移,直到所有节点的状态都被计算出来。

示例 

问题描述: 给定一棵有根树,每个节点有两个属性:权重和价值。节点的权重表示该节点所需要的空间,节点的价值表示该节点的价值。现在有一个给定的背包容量,要求选择一些节点放入背包中,使得总权重不超过背包容量,同时总价值最大。

输入:

  • 一棵树的节点数
  • 每个节点的权重和价值
  • 背包容量

输出:

  • 最大的总价值

求解思路 

这个例子是一个经典的背包问题在树结构中的应用。我们需要在给定的一棵有根树中,选择一些节点放入背包中,使得总权重不超过背包容量,同时总价值最大。

为了解决这个问题,我们可以使用动态规划的方法。具体思路如下:

  1. 定义状态:我们定义dp[i][j]表示以节点i为根节点的子树中,在背包容量为j的情况下,可以获得的最大总价值。

  2. 状态转移方程:对于节点i的每个孩子节点child,我们需要考虑两种情况:

    • 不选择child节点:此时dp[i][j]不变。
    • 选择child节点:此时需要从剩余容量j减去child节点的权重,即j - tree[child].weight,并从子问题dp[child][j - tree[child].weight]中得到最大价值,再加上child节点的价值tree[child].value。整体来看,选择child节点后的最大总价值为dp[child][j - tree[child].weight] + tree[child].value。

    综合考虑上述两种情况,我们可以得到状态转移方程:

    dp[i][j] = max(dp[i][j], dp[child][j - tree[child].weight] + tree[child].value)

    其中,child为节点i的孩子节点。

  3. 初始化:我们将dp数组初始化为0,表示初始时没有选择任何节点。

  4. 从根节点开始进行深度优先搜索(DFS),按照上述状态转移方程更新dp数组中的值。最终,dp[1][背包容量]即为所求的最大总价值。

下面是代码中主要部分的解释:

 
void dfs(int node) {for (int child : tree[node].children) {// 对每个孩子节点进行深度优先搜索dfs(child);// 更新dp数组for (int i = dp[node].size() - 1; i >= tree[node].weight; i--) {dp[node][i] = max(dp[node][i], dp[child][i - tree[node].weight] + tree[child].value);}}
}

在dfs函数中,我们首先对当前节点的每个孩子节点进行深度优先搜索。然后,通过一个循环,从dp[node]的最后一个元素开始向前更新dp[node]的值。这里使用了倒序循环的方式,是因为我们需要保证在更新dp[node][i]时,dp[child][i - tree[node].weight]已经被计算过(即在dp[node]的前面位置)。同时,我们需要确保总权重不超过背包容量,所以我们从tree[node].weight开始遍历。

最后,在主函数中,我们输入节点数和每个节点的权重、价值信息,构建树结构,并调用dfs函数进行求解。最终结果存储在dp[1][背包容量]中。

希望以上详细解释能够帮助你理解这个树状动态规划问题的解决方法。如有任何疑问,请随时提出。

示例:

输入:
节点数 = 5
节点 1: 权重 = 2, 价值 = 3
节点 2: 权重 = 1, 价值 = 2
节点 3: 权重 = 3, 价值 = 4
节点 4: 权重 = 2, 价值 = 2
节点 5: 权重 = 1, 价值 = 1
背包容量 = 5输出:
最大总价值 = 9

C++代码实现:

#include <iostream>
#include <vector>
using namespace std;struct Node {int weight;int value;vector<int> children;
};vector<Node> tree;  // 存储树节点的信息
vector<vector<int>> dp;  // 存储动态规划的结果void dfs(int node) {for (int child : tree[node].children) {dfs(child);for (int i = dp[node].size() - 1; i >= tree[node].weight; i--) {dp[node][i] = max(dp[node][i], dp[child][i - tree[node].weight] + tree[child].value);}}
}int main() {int n;  // 节点数cin >> n;tree.resize(n + 1);  // 从编号1开始存储节点信息dp.resize(n + 1, vector<int>(n + 1, 0));  // 初始化动规数组for (int i = 1; i <= n; i++) {cin >> tree[i].weight >> tree[i].value;}// 构建树结构for (int i = 2; i <= n; i++) {int parent;cin >> parent;tree[parent].children.push_back(i);}dfs(1);  // 从根节点开始进行深度优先搜索cout << "最大总价值 = " << dp[1][n] << endl;return 0;
}

这段代码首先通过输入构建了一棵树,并使用动态规划方法计算了最大总价值。其中,dfs函数进行了深度优先搜索和动态规划的计算,dp数组用于存储动态规划的结果。

http://www.mmbaike.com/news/55810.html

相关文章:

  • 羊肉口报关做网站长沙建站seo公司
  • 网站搭建需要服务器吗有哪些免费网站可以发布广告
  • 南阳网站建设哪家好优化方案
  • 领卷网站怎么做上海牛巨微seo优化
  • 网站建设5000费用预算百度的广告
  • 深圳网站建设网站制作网站推广自建网站
  • 如何通过阿里云自己做网站优化大师app
  • wordpress做小说网站吗职业技能培训机构
  • 公司网站做的比较好网络营销策略理论
  • 制作网站开发公司网站推广宣传语
  • 北京做冷冻牛羊肉的网站官方百度app下载
  • 网站建设和维护管理预算网站收录怎么弄
  • 给酒吧做网站指数计算器
  • 猪猪券网站建设谷歌推广和seo
  • 自己如何建设外贸网站建站济南seo网站关键词排名
  • 永康做网站的公司企业宣传方式有哪些
  • 珠海做网站价格短视频营销策略有哪些
  • 个人小白如何做手游代理上海关键词优化的技巧
  • 最专业网站建设哪家好网页设计软件有哪些
  • 泉州优化营商环境青岛seo排名收费
  • 宁波网站建设详细策划百度指数查询官网
  • 郑州做网站优化外包教育培训机构有哪些
  • 网站做垃圾分类今日头条新闻大事件
  • 网站制作策划seo外包靠谱
  • 团员建设网站公司seo营销
  • 杰讯山西网站建设搜索引擎优化策略包括
  • 网站实现中英文长沙网站制作
  • 网站系统与程序的链接五个常用的搜索引擎
  • 头条网站怎么做沧州网站seo公司
  • 重庆承越网站建设公司sem工作内容