首页 > 其他分享 >树上背包优化 - 时间复杂度证明

树上背包优化 - 时间复杂度证明

时间:2023-08-23 17:11:27浏览次数:42  
标签:nxt 背包 sz int 复杂度 dfs 树上 dp

树上背包优化 - 时间复杂度证明

  • 例题
  • 树上背包顾名思义,就是在树上做背包 dp
  • 树上背包的模板代码如下
void dfs(int x){
	sz[x] = 1;
	if(x >= n - m + 1){
		dp[x][1] = -a[x];
		return;
	}
	for(PII e : eg[x]){
		int nxt = e.first;
		dfs(nxt);
		sz[x] += sz[nxt];
		for(int j = m; j >= 0; j--){
			for(int h = 1; h <= j; h++){
				dp[x][j] = min(dp[x][j], dp[x][j - h] + e.second + dp[nxt][h]);
			}
		}
	}
}
  • 但是这样的循环显然是 \(O(n^3)\) 的
  • 这有一种固定的优化方法,可以将这三个循环优化到理论 \(O(n^2)\)

优化

void dfs(int x){
  if(x >= n - m + 1){
    dp[x][1] = -a[x];
    sz[x] = 1;
    return;
  }
  for(PII e : eg[x]){
    int nxt = e.first;
    dfs(nxt);
    for(int j = sz[x]; j >= 0; j--){
      for(int h = sz[nxt]; h >= 0; h--){
        dp[x][j + h] = min(dp[x][j + h], dp[x][j] + e.second + dp[nxt][h]);
      }
    }
    sz[x] += sz[nxt];
  }
}

标签:nxt,背包,sz,int,复杂度,dfs,树上,dp
From: https://www.cnblogs.com/huangqixuan/p/17652214.html

相关文章

  • hdu 2191 多重背包
    http://acm.hdu.edu.cn/showproblem.php?pid=2191#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>usingnamespacestd;structele{intprice;......
  • P1612 [yLOI2018] 树上的链
    因为自己太憨了,所以交了好几次都没过,谢谢审核大大!!!思路因为这是一棵树,所以每个节点只有一个父亲,那么选定一个结点,它到根节点的路径唯一。所以第一个思路就是暴力,对于每一个节点,直接暴力向上枚举,找到第一个满足条件的节点,然后输出长度即可。但是显然,第一种方法很容易TLE,所以我......
  • 树上问题4题
    P1600首先肯定要用到LCA,先用DFS预处理每个节点的第\(2^k\)代祖先和每个节点的深度,倍增计算LCA即可。最直接的做法是模拟每个人跑步的过程,但这种方法的最差复杂度是\(O(nm)\),肯定会超。考虑优化模拟过程,将模拟玩家改为枚举观察员,计算有几名玩家会为观察员做贡献。对于观察......
  • 背包DP笔记
    背包问题01背包问题有\(n\)件物品和一个容量为\(V\)的背包,第\(i\)件物品的体积为\(w[i]\),价值为\(v[i]\)。请选择将哪些物品装入背包,使得价值总和最大。思路:每种物品仅有一件,可以选择放或不放。令\(f[i][j]\)表示前\(i\)件物品放入一个容量为\(j\)的背包可以获......
  • c++算法之动态规划:01背包
    什么是动态规划?动态规划算法(dynamicprograming),是一种由递推为基础的比贪心更稳定的一种优化策略,为运筹学的一部分。就是通过以递推为基础的手段非暴力求出最值。它的总体思想其实就是一个比较过程:假如你有一个数据,它的价值是x,代价为y,如果用动态规划就是和你不加这个元素和你加......
  • 算法复杂度和简单排序
    选择排序和冒泡排序选择排序是O(n2),每次选取最大的,放在最前面,然后下次从第二个开始找到最后一个。冒泡也是O(n2),一直交换到最后。插入排序插入排序最坏是O(n2),最好是O(n),但是算法一般都是按照最坏的来。插入是先排序0-1,然后0-2,然后0-3,eq.:排序0-5时,0-4已经排序好了,只需要......
  • visual studio2022中使被排除的文件重新恢复显示在项目文件树上
    项目中有个叫Shape.cs的文件,不小心被排除了。使用添加现有项重新加入的话,IDE会提示文件已被添加,需要重新覆盖吗?此时不管选yesorno,这个cs文件不会出现在项目文件树上。选择编辑项目可以看到把这条Item配置删掉,cs文件就会重新出现在项目文件树上......
  • 贪心算法--背包问题--分数背包
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-stuffs=[(60,10),(100,20),(120,30)]#每个商品元组表示(价格,重量)stuffs.sort(key=lambdax:x[0]/x[1],reverse=True)deffractional_backpack(goods,w):m=[0for_inr......
  • 【树】树上动态规划
    目录引入树形dp树上递推先序遍历(关键词:到根)后序遍历(关键词:子树)求直径(树上最长路径)换根DP法树上背包链式前向星引入考虑这样一个问题(P1352没有上司的舞会):一棵树,每个节点\(i\)都有价值\(v_i\),对于每个子节点,不能和父节点同时选择,求最大价值和。令dp[x][0]为在x的子树中......
  • 算法复杂度速查表
    https://zhuanlan.zhihu.com/p/158694568目录目录1.背景2.Big-OComplexityChart3.CommonDataStructureOperations4.ArraySortingAlgorithms1.背景最近看到一篇总结算法复杂度的博客,原作者Eric是为了面试方便而总结出了一份算法复杂度速查表,在此转载一下......