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

企业建网站报价邯郸网站设计培训机构

企业建网站报价,邯郸网站设计培训机构,网上做任务网站有哪些内容,东莞网络营销网站建设【题目链接】 ybt 1576:【例 2】选课 洛谷 P2014 [CTSC1997] 选课 【题目考点】 1. 树形动规 2. 有依赖的背包(树形背包) 选择一个物品的前提是选另一件物品,而这些依赖关系构成了一个树形关系。在背包容量有限的情况下&…

【题目链接】

ybt 1576:【例 2】选课
洛谷 P2014 [CTSC1997] 选课

【题目考点】

1. 树形动规
2. 有依赖的背包(树形背包)

选择一个物品的前提是选另一件物品,而这些依赖关系构成了一个树形关系。在背包容量有限的情况下,求选出的物品的最大总价值。

【解题思路】

本题是有依赖的背包模板题。该类背包问题可以通过树形动规来解决。
每门课程是一个结点。课程是学分是结点的权值(点权)。如果a课程是b课程的先修课,那么结点a与结点b之间有一条边。
假想所有不要求有先修课的课程,都以0号课程为先修课。这样整棵树就以0号结点为根。该0号结点必须选择,因此结点数n与边数m要在输入的数值基础上增加1。
本题抽象为:在有n个结点的树上选择m个结点,必须选择一个结点的前提是选择这个结点的双亲,求选出结点的最大点权加和。
使用树形动规算法解决该问题。

解法1:树形动规 有依赖的背包 原解法

状态定义
  • 阶段:以u为根的树的前i个子树,选择结点数量j
  • 决策:选择几个结点
  • 策略:选择结点的方案
  • 策略集合:根结点u的前i个子树中选择j个结点的所有方案
  • 条件:权值和最大
  • 统计量:权值和

dpu,i,jdp_{u,i,j}dpu,i,j: 根结点u的前i个子树中选择j个结点的所有方案中,权值和最大的方案的权值和。

状态转移方程
  • 策略集合:根结点u的前i个子树中选择j个结点的所有方案
  • 分割策略集合:根据对每个子树选择结点数不同来分割策略集合

wuw_uwu为结点u的权值。
对于以u为根的树,如果选0个结点,权值和为0。dpu,0,0=0dp_{u,0,0} = 0dpu,0,0=0
如果选1个结点,一定会选择结点u,dpu,0,1=wudp_{u,0,1} = w_udpu,0,1=wu
如果要选择j个结点,选择结点数最少1个,最多m个。在子树中需要选择j-1个结点。
对于结点u的第i个孩子v(v的孩子数量为cvc_vcv)
如果在以v为根的子树中选择k个结点,选出结点的最大权值加和为dpv,cv,kdp_{v,c_v,k}dpv,cv,k
接下来需要在结点u的前i-1个子树中选择j-k个结点,选出结点的最大权值加和为dpu,i−1,j−kdp_{u, i-1, j-k}dpu,i1,jk
二者加和即为在以u为根树的前i个子树中选出j个结点能得到的最大权值加和。
k最小为0,最大为j-1,对所有k的取值情况,求该表达式的最大值,即为所求的状态。
dpu,i,j=max⁡0≤k<j{dpu,i−1,j−k+dpv,cv,k}dp_{u,i,j} = \underset{0\le k < j}\max\{dp_{u,i-1,j-k}+dp_{v,c_v,k}\}dpu,i,j=0k<jmax{dpu,i1,jk+dpv,cv,k}

由于本题输入时就已知结点之间的双亲-孩子关系,那么就可以建有向图。使用vector数组vector<int> edge[N];保存有向图的邻接表。那么edge[v].size()就是结点v的孩子数量cvc_vcv
在dfs的过程中,访问到结点u,先设初始状态dpu,0,0dp_{u,0,0}dpu,0,0。而后遍历孩子,从结点u访问孩子v,在完成从v出发的搜索后,再根据状态转移方程完成从孩子v到双亲u的递推。
最终以结点0为根,前c0c_0c0个子树中选择m个结点能获得的最大权值dp0,c0,mdp_{0,c_0,m}dp0,c0,m即为本题的结果。
时间复杂度:dfs中双重循环递推是O(m2)O(m^2)O(m2)复杂度,dfs搜索递归调用的次数为n,因此总体时间复杂度为O(nm2)O(nm^2)O(nm2)
空间复杂度为O(n2m)O(n^2m)O(n2m)

优化解法1:树形动规 滚动数组优化

在求dpu,i,jdp_{u,i,j}dpu,i,j时,只用到了第二维为i-1时的数据dpu,i−1,j−kdp_{u,i-1,j-k}dpu,i1,jk
可以进行滚动数组优化,同时必须将第三维jjj倒序遍历。
滚动数组优化方法见:ybt 1267:【例9.11】01背包问题
而后就可以将i所在的第二维优化掉。
空间复杂度降为:O(nm)O(nm)O(nm)

优化解法2:树形动规 滚动数组优化 结点数优化

考察子树结点总数对状态转移的限制。
sizusiz_usizu表示根结点为u的树的结点数。
深搜过程中,sizusiz_usizu表示根结点为u的树的根结点加上前i个子树的结点数。
在访问到u的孩子v时,先将sizusiz_usizu增加以v为根的子树的结点数sizvsiz_vsizv

  1. 根结点为u的树取前i个子树的结点,取到的结点数量一定小于等于sizusiz_usizu,所以j的最大值取min⁡{sizu,m}\min\{siz_u,m\}min{sizu,m}
  2. 根结点为v的子树取到的结点数量一定小于等于sizvsiz_vsizv,因此在子树v中选择的结点数量k的最大值为min⁡{j−1,sizv}\min\{j-1, siz_v\}min{j1,sizv}

加上以上限制后,代码的时间复杂度降至O(n2)O(n^2)O(n2),具体证明见证明:有依赖背包结点数优化后为O(n^2)

【题解代码】

解法1:树形动规 有依赖的背包 三维状态

时间复杂度:O(nm2)O(nm^2)O(nm2) ,空间复杂度:O(n2m)O(n^2m)O(n2m)

#include<bits/stdc++.h>
using namespace std;
#define N 305
int n, m, w[N], dp[N][N][N];//dp[u][i][j]:结点u的前i个孩子,最多选择j门课能获得的最大学分 
vector<int> edge[N];
void dfs(int u)
{int i = 1;dp[u][0][1] = w[u];for(int v : edge[u]){dfs(v);		for(int j = 1; j <= m; ++j)//在树中选j门课 for(int k = 0; k < j; ++k)//在子树v中选了k门课 (因为还要选v,最多选j-1门) dp[u][i][j] = max(dp[u][i][j], dp[u][i-1][j-k]+dp[v][edge[v].size()][k]); i++;}
}
int main()
{int f;cin >> n >> m;n++, m++;//算上0号结点 for(int i = 1; i < n; ++i){cin >> f >> w[i];edge[f].push_back(i);}dfs(0);cout << dp[0][edge[0].size()][m];return 0;
}

优化解法1:树形动规 有依赖的背包 滚动数组优化

时间复杂度:O(nm2)O(nm^2)O(nm2) ,空间复杂度:O(nm)O(nm)O(nm)

#include<bits/stdc++.h>
using namespace std;
#define N 305
int n, m, w[N], dp[N][N];//dp[u][i][j]:结点u的前i个孩子,最多选择j门课能获得的最大学分 
vector<int> edge[N];
void dfs(int u)
{dp[u][1] = w[u];//选1门课,就只能选自己 for(int v : edge[u]){dfs(v);for(int j = m; j >= 1; --j)//在树中选j门课 for(int k = 1; k < j; ++k)//在子树v中选了k门课 (因为还要选v,最多选j-1门) dp[u][j] = max(dp[u][j], dp[u][j-k]+dp[v][k]); }
}
int main()
{int f;cin >> n >> m;n++, m++;//算上0号结点 for(int i = 1; i < n; ++i){cin >> f >> w[i];edge[f].push_back(i);}dfs(0);cout << dp[0][m];return 0;
}

优化解法2:树形动规 有依赖的背包 结点数优化

时间复杂度:O(n2)O(n^2)O(n2) ,空间复杂度:O(nm)O(nm)O(nm)

#include<bits/stdc++.h>
using namespace std;
#define N 305
int n, m, w[N], siz[N], dp[N][N];//dp[u][i][j]:结点u的前i个孩子,最多选择j门课能获得的最大学分 
vector<int> edge[N];
void dfs(int u)
{dp[u][1] = w[u];//选1门课,就只能选自己 siz[u] = 1;for(int v : edge[u]){dfs(v);siz[u] += siz[v];for(int j = min(m, siz[u]); j >= 1; --j)//在树中选j门课 for(int k = 1; k < j && k <= siz[v]; ++k)//在子树v中选了k门课 (因为还要选v,最多选j-1门) dp[u][j] = max(dp[u][j], dp[u][j-k]+dp[v][k]); }
}
int main()
{int f;cin >> n >> m;n++, m++;//算上0号结点 for(int i = 1; i < n; ++i){cin >> f >> w[i];edge[f].push_back(i);}dfs(0);cout << dp[0][m];return 0;
}
http://www.dtcms.com/a/588210.html

相关文章:

  • 开网店做代理的公司网站北京平台网站建设多少钱
  • 做国际贸易哪个网站好做黄图网站接广告好赚吗
  • 网站没有备案怎么申请广告小程序制作软件费用
  • 如何提高网站访问速度safari网页视频怎么下载
  • 网站推广策划执行方案郑州比较大的软件公司
  • 企业专业网站建设建设网站列表
  • 家庭厨房做外卖网站简单电商网站模板
  • 昌做网站wordpress登录空白页
  • 建设银行湖北省分行 网站wordpress电子书
  • 某男神去年年底来某网站做见面会_竟要求安保人数超过两位数用visual做网站
  • 怎么做网站的百度收录网站备案背景幕布打印多大
  • 胶州市网站建设介绍国外的网站有什么不同
  • 浏览器无法打开住房和建设网站软件定制开发软件开发
  • 网站浏览历史能恢复吗怎么设置的山东聊城建设学校怎么样
  • 网站制作职责网站制作需要学什么语言
  • 手机网站怎么导入微信网站建设内容策划案
  • 网站开发合同模板免费网络品牌推广方法有哪些
  • 一台云服务器可以做几个网站哪里有广告设计制作的培训
  • 网站开发的内容和特点开发小程序费用一览表
  • 企业网站大全花儿直播免费视频观看
  • 聊城市城乡建设部网站查询建筑图集网站
  • 2024免费网站推广怎么制作自己的微信小程序
  • 奉贤做网站价格创意设计图片素材
  • wordpress百度秀seo 培训教程
  • 网站模型怎么做的培训机构网站制作
  • 中小企业网站制作方法做网站需要拉多大的宽带
  • 开装潢公司做网站短网址
  • 公司网站平台的作用wordpress更新文章
  • 秦淮html5响应式网站Wordpress博客欣赏
  • 网站建设 温州两颗米网站建设