证明:有依赖背包结点数优化后为O(n^2)

证明:有依赖背包结点数优化后为 O ( n 2 ) O(n^2) O(n2)

siz[u]表示以u为根的树的结点数
深搜过程中,siz[u]表示根结点为u的树的根结点加上前i个子树的结点数。

  1. 根结点为u的树取前i个子树的结点,取到的结点数量小于等于siz[u]
  2. 根结点为v的子树取到的结点数量小于等于siz[v]

例:
洛谷 P2014 [CTSC1997] 选课 使用结点数优化

#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 = 0; 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;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;
}

假设m很大,不考虑j的影响,其核心代码可以视作:

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 = siz[u]; j >= 1; --j)for(int k = 0; <= siz[v]; ++k)dp[u][j] = max(dp[u][j], dp[u][j-k]+dp[v][k]); }
}

设根结点为u的树的结点数量为n,
证明:上述代码的复杂度为 O ( n 2 ) O(n^2) O(n2)
设结点u有k个子树1、2、3、…、k
每个子树的结点数分别为 a 1 , a 2 , . . . , a k a_1, a_2, ..., a_k a1,a2,...,ak,因此有 a 1 + a 2 + . . . + a k = n − 1 a_1+a_2+...+a_k = n-1 a1+a2+...+ak=n1
该代码中,双重循环内层语句的运行次数近似为: a 1 ∗ a 1 + ( a 1 + a 2 ) ∗ a 2 + ( a 1 + a 2 + a 3 ) ∗ a 3 + . . . + ( a 1 + . . . + a k ) ∗ a k a_1*a_1+(a_1+a_2)*a_2+(a_1+a_2+a_3)*a_3+...+(a_1+...+a_k)*a_k a1a1+(a1+a2)a2+(a1+a2+a3)a3+...+(a1+...+ak)ak
使用数学归纳法:

  1. 如果结点u的孩子都是叶子结点,则 a 1 , a 2 , . . . , a k a_1, a_2, ..., a_k a1,a2,...,ak都为1,那么语句运行次数为: 1 + 2 + . . . + k = ( 1 + k ) ⋅ k / 2 ≤ k 2 1+2+...+k =(1+k)\cdot k/2 \le k^2 1+2+...+k=(1+k)k/2k2
  2. 如果结点u的孩子不都是叶子结点,对于子树x的递归调用,语句运行次数 ≤ a x 2 \le a_x^2 ax2,因此总语句运行次数 ≤ a 1 ∗ a 1 + ( a 1 + a 2 ) ∗ a 2 + ( a 1 + a 2 + a 3 ) ∗ a 3 + . . . + ( a 1 + . . . + a k ) ∗ a k + a 1 2 + a 2 2 + . . . + a k 2 \le a_1*a_1+(a_1+a_2)*a_2+(a_1+a_2+a_3)*a_3+...+(a_1+...+a_k)*a_k+a_1^2+a_2^2+...+a_k^2 a1a1+(a1+a2)a2+(a1+a2+a3)a3+...+(a1+...+ak)ak+a12+a22+...+ak2
    将前面每项写开
    a 1 2 a_1^2 a12
    a 1 ∗ a 2 + a 2 2 a_1*a_2+a_2^2 a1a2+a22
    a 1 ∗ a 3 + a 2 ∗ a 3 + a 3 2 a_1*a_3+a_2*a_3+a_3^2 a1a3+a2a3+a32

    a 1 ∗ a k + . . . + a k 2 a_1*a_k+...+a_k^2 a1ak+...+ak2
    相加得
    a 1 ∗ ∑ i = 1 k a i + a 2 ∗ ∑ i = 2 k a i + a 3 ∗ ∑ i = 3 k a i + . . . + a k ∗ a k < a_1*\sum_{i=1}^k{a_i}+a_2*\sum_{i=2}^k{a_i}+a_3*\sum_{i=3}^k{a_i}+...+a_k*a_k < a1i=1kai+a2i=2kai+a3i=3kai+...+akak<
    a 1 ∗ ∑ i = 1 k a i + a 2 ∗ ∑ i = 1 k a i + a 3 ∗ ∑ i = 1 k a i + . . . + a k ∗ ∑ i = 1 k a i = ( ∑ i = 1 k a i ) 2 = ( a 1 + a 2 + . . . + a k ) 2 = ( n − 1 ) 2 < n 2 a_1*\sum_{i=1}^k{a_i}+a_2*\sum_{i=1}^k{a_i}+a_3*\sum_{i=1}^k{a_i}+...+a_k*\sum_{i=1}^k{a_i} = (\sum_{i=1}^k{a_i})^2 = (a_1+a_2+...+a_k)^2=(n-1)^2<n^2 a1i=1kai+a2i=1kai+a3i=1kai+...+aki=1kai=(i=1kai)2=(a1+a2+...+ak)2=(n1)2<n2
    a 1 2 + a 2 2 + . . . + a k 2 < ( a 1 + a 2 + . . . + a k ) 2 = ( n − 1 ) 2 < n 2 a_1^2+a_2^2+...+a_k^2 < (a_1+a_2+...+a_k)^2=(n-1)^2<n^2 a12+a22+...+ak2<(a1+a2+...+ak)2=(n1)2<n2
    因此语句总运行次数 < 2 n 2 <2n^2 <2n2
    因此该算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloudAlibaba

文章目录 一、SpringCloudAlibaba是什么&#xff1f;二、核心组件1 Nacos1.1 Nacos介绍1.2 什么是Nacos&#xff1f;1.3 为何使用Nacos&#xff1f; 2.Sentinel2.1 什么是Sentinel2.2 Sentinel好处 3 GateWay3.1 网关介绍3.2 GateWay3.3 基本概念&#xff1a; 4 Seata4.1 分布式…

4.进程相关

1.关于进程和程序的相关定义 1.1 程序的相关定义 程序通俗来讲就是我们的源代码文件&#xff0c;然后里面还包含了其他的文件信息 程序入口地址&#xff1a;也就是 main 函数的位置 1.2 进程的相关定义 进程需要资源&#xff1a;CPU &#xff0c;内存 进程是一个抽象定义&a…

QDataStream:使用指南、技巧与注意事项

QDataStream是Qt框架中用于处理二进制数据序列化和反序列化的核心类。它提供了高效、跨平台的方式&#xff0c;将C数据结构转化为字节流&#xff0c;便于在网络传输、持久化存储等场景下使用。本文将详尽解析QDataStream的使用方法、实用技巧以及在实际应用中应注意的问题。 一…

免费游戏云服务器推荐,一键搭建我的世界(MC)及幻兽帕鲁服务器!

随着云计算的普及和发展&#xff0c;越来越多的人开始尝试在云服务器上搭建游戏服务器。本文将为大家推荐一款免费游戏云服务器&#xff0c;可以一键搭建我的世界(MC)或者幻兽帕鲁服务器。 雨云是一家国内的云计算服务提供商&#xff0c;为了吸引用户&#xff0c;推出了积分免费…

从误差分解看Few-shot的核心问题

FSL训练过程一般都是最小化经验误差ERM。 同时&#xff0c;由于现实任务的实际数据分布 是未知的&#xff0c;因此无法找到一个最优的参数组合 &#xff0c;能最小化期望损失&#xff08;最小值多少也是未知的&#xff09;&#xff0c;我们能做的实际上是尽可能的去找一个参数…

【大数据篇】Flink全面入门指南

Apache Flink 是一个开源的流处理框架&#xff0c;用于在高吞吐量和低延迟的条件下处理无界和有界数据流。Flink 设计用于运行在所有常见的集群环境&#xff0c;如 Hadoop YARN、Apache Mesos 和 Kubernetes 上&#xff0c;并以“流式计算”为核心思想&#xff0c;同时也支持批…

如何打造一个好的(Vue)组件库?这里有一个清单

你是否考虑过在 Vue.js 或其他框架中构建组件库&#xff0c;或者你需要它来构建可重用的设计系统&#xff0c;以减少投入市场的时间并提供视觉一致性&#xff0c;或者你想为社区贡献另一个组件库。 你可能想立即投入进去并开始编码&#xff0c;但是首先你必须退后一步&#xf…

redis string底层为什么使用sds, sds好处?redis 的动态字符串优点?

1. redis 的键值对&#xff0c;都是由对象组成的&#xff0c; 其中键总是一个字符串对象&#xff08;string object&#xff09; 而键的value则可以是&#xff1a;“字符串对象”&#xff0c; “列表对象 &#xff08;list object&#xff09;”&#xff0c;“哈希对象 (hash o…

Jtti云服务器是怎么实现云端数据分发和内容传输优化?

云服务器通过实现云端数据分发和内容传输优化来提高性能、可靠性和效率。这通常涉及以下几个方面的技术和方法&#xff1a; 1. CDN(内容分发网络) 内容分发网络(CDN)是一种分布式网络架构&#xff0c;用于将内容(如网页、图像、视频等)分发到全球各地的用户。CDN通过在全球各地…

蓝桥杯每日一题(背包dp,线性dp)

//3382 整数拆分 将 1,2,4,8看成一个一个的物品&#xff0c;以完全背包的形式放入。 一维形式&#xff1a;f]0]1; #include<bits/stdc.h> using namespace std; //3382整数拆分 const int N1e610, M5e510; int mod1e9; int f[N],n; int main() {cin>>n;//转化为完…

linux 迁移home目录以及修改conda中pip的目录,修改pip安装路径

1&#xff09;sudo rsync -av /home/lrf /data/home/lrf 将/home目录下的文件进行复制&#xff08;假设机械硬盘挂载在/data目录下&#xff09;** 2&#xff09;usermod -d /data/home/lrf -m lrf 修改用户$HOME变量** 3&#xff09;vi /etc/passwd 查看对应用户的$HOME变量是…

网络安全加密算法---对称加密

三位同学一组完成数据的对称加密传输。 三位同学分别扮演图中 A、B 和 KDC 三个角色&#xff0c;说明 KA、KB&#xff0c;KAB 和发送的数据Data 的内容。 给出图中 2 和 3 中的数据&#xff0c;以及 Data 加密后的密文。可以完成多轮角色互换的通信 过程。其中一轮过程要求 K…

洗地机如何选?入手这四款优质好有,幸福感爆棚!

家庭清洁作为每天都必干的一件事&#xff0c;房屋的整洁是让人保持心情愉悦的一种方式。不过每次拿着清洁工具一顿劳作后总是会腰酸背痛&#xff0c;但是洗地机的出现为我们解放了双手。相对于传统的清洁工具&#xff0c;洗地机功能更多样更高效。那么市面上洗地机哪个牌子好&a…

LeetCode31. 下一个排列(Java)

题目&#xff1a; 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列…

助理物流师资格认证考试大纲《现代物流管理》

现 代 物 流 管 理 第一章 现代物流 一、物流概述 二、物流活动 三、物流科学理论学说 四、物流科学的产生及其意义 第二章 采购管理 一、采购概述 二、采购计划与决策 三、采购的流程 四、供应商管理 第三章 包装及装卸搬运 一、包装 二、包装材料与设计 三、…

转转技术--什么!服务器内存又双叒叕打满了!

原文地址:https://mp.weixin.qq.com/s/o_epKOBXKuM-qOT7_zXayQ 1 问题背景2 问题现象3 定位原因4 问题小结5 总结 1 问题背景 深夜&#xff0c;小菜同学突然被一阵急促的报警声吵醒&#xff0c;原来是手机收到了一连串关于容器内存使用率过高的报警信息。赶紧打开电脑查看服…

【Java8新特性】三、方法引用和构造器引用

这里写自定义目录标题 一、方法引用1、demo 二、构造器引用三、数组引用 一、方法引用 当要传递给Lambda体的操作&#xff0c;已经有实现的方法了&#xff0c;可以使用方法引用&#xff01; 方法引用&#xff1a;使用操作符 “::” 将方法名和对象或类的名字分隔开来。 主要…

C++ 11 ~ C++21标准发展及其新特性概览

C++是一种广泛应用的编程语言,自从1983年由Bjarne Stroustrup首次引入以来,它已经经历了多次重要的标准更新。每次更新都在语言的功能性、性能和易用性方面带来了显著的改进。本文将详细介绍自C++11以来的每个主要版本的新特性,并通过示例代码展示它们的应用。 C++11 (2011…

PyQt PySide6零基础入门与项目实战视频教程

目录 课程亮点课程大纲第一章&#xff1a;基础篇 PySide6开发环境安装第二章 控件与布局篇 PySide6常用控件与界面布局使用介绍第三章 信号槽与事件机制第四章 QMainWindow应用篇第五章 样式表qss与自定义控件第六章 图表与曲线第七章 数据库编程第八章 项目实战&#xff1a;高…

Java—抽象方法与接口

声明&#xff1a;以下内容是根据B站黑马程序员的Java课程&#xff0b;博主自己的理解整理而成&#xff0c;课程很好&#xff0c;适合初学者学习。 关于此类题目&#xff0c;重要的是识别出用什么来实现&#xff0c;到底是接口还是抽象方法&#xff0c;还是共有的属性等等&…