【算法】动态规划之背包DP与树形DP

前言:

本系列是学习了董晓老师所讲的知识点做的笔记

董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com)

动态规划系列 

【算法】动态规划之线性DP问题-CSDN博客

【算法】动态规划之背包DP问题(2024.5.11)-CSDN博客

背包DP

背包问题方案数

f[i]表示背包容量为i时能装入物品的最大价值,c[i]表示营包容量为i时最优选法的方案数

for (int i = 0; i <= m; i++) c[i] = 1;//背包里不装入物品也是一种方案for (int i = 1; i <= n; i++){scanf("%d%d", &v, &w);for (int j = m; j >= v; j--) {if (f[j - v] + w > f[j]) {//容量从j-v增加到j,只是多装入一件物品,没有改变方案数c[j-v]所以c[j] = c[j-v]f[j] = f[j - v] + w;c[j] = c[j - v];}else//不装入新物品,容量j已有的方案数为c[j]; //若装入新物品,容量j对应的方案数为c[j - v]//两种情况,方案显然不同,所以取和。为防止爆掉int,对大数取余c[j] = (c[j] + c[j - v]) % mod;}}printf("%d\n", c[m]);

背包问题求具体方案

题目要求输出字典序最小的方案,假设存在一个包含第1个物品的最优解,为了确保字典序最小那么我们必然要选第1个。那么问题就转化成从2~N这些物品中找到最优解。

首先,我们从后向前遍历物品,让最优解落在f[1][m]中;

然后,我们从f[1][m]开始搜索字典序最小的路径方案。

状态定义:f[i][j]表示从第i个物品到最后一个物品装入容量为j的背包的最优解。

状态转移:f[i][j]= max(f[i+1][j],f[i+1][j-v[i]]+ w[i])

  for(int i=1; i<=n; i++) cin>>v[i]>>w[i];for(int i=n; i>=1; i--)   //逆序取物 for(int j=0; j<=m; j++){  f[i][j]=f[i+1][j];p[i][j]=j;              //记录路径列 if(j>=v[i])f[i][j]=max(f[i][j],f[i+1][j-v[i]]+w[i]);if(j>=v[i] && f[i][j]==f[i+1][j-v[i]]+w[i])p[i][j]=j-v[i];//记录路径列}int j=m;for(int i=1; i<=n; i++){//找路if(p[i][j]<j){printf("%d ",i);j=p[i][j];}

树形DP

一般思路:

      线形DP子结构是一条线段,树形DP子结构是一颗子树。从分析子树入手,最优解通常是与子树根节点u有关的函数,状态计算就是寻找根点与子节点以及边权的递推关系。

      编写代码,通常要dfs,从根到叶一路深搜,再从叶到根做后序DP,每次用其子树的f值更新当前节点的f值,兜了一圈回到根节点根节点的f值就是全局最优解。

没有上司的舞会

P1352 没有上司的舞会 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

存储代码

vector<int>a[N];cin >> x >> y;
a[y].push_back(x);

核心代码

void dfs(int u) {//深搜节点+后序DPf[u][1] = w[u];//选u的快乐指数for (int v : a[u]) {dfs(v);f[u][0] += max(f[v][0], f[v][1]);//不选择根节点的话,他的子节点可选可不选(根据题意)f[u][1] += f[v][0];//选择根节点,子节点不可以选(根据题意)}

 总代码

#include<iostream>
#include<vector>
using namespace std;
const int N =6010;
int n;
int w[N];
vector<int> a[N];
bool fa[N];
int f[N][2];void dfs(int u) {//深搜节点+后序DPf[u][1] = w[u];//选u的快乐指数for (int v : a[u]) {dfs(v);f[u][0] += max(f[v][0], f[v][1]);//不选择根节点的话,他的子节点可选可不选(根据题意)f[u][1] += f[v][0];//选择根节点,子节点不可以选(根据题意)}}
int main() {cin >> n;for (int i = 1; i <= n; i++)  cin >> w[i];//存储快乐指数for (int i = 0; i < n - 1; i++) {int x, y;cin >> x >> y;//把y的邻接点x存入数组a//y的邻接点个数存入b数组中去a[y].push_back(x);fa[x] = true;//x有父亲节点}int root = 1;while (fa[root])  root++;//找根节点 如果他有父亲节点的话就说明他不是根节点dfs(root);cout << max(f[root][0], f[root][1]);//选择根节点或者不选择根节点}

树形背包

 对01背包进行的改造:

f[i]表示背包容量为i时能装入物品的最大价值
c[i]表示营包容量为i时最优选法的方案数 

void dfs(int u){for(int i=v[u];i<=m;i++) f[u][i]=w[u];//如果选u的话,体积不能够小于v[u]for(int i=0;i<b[u];i++){  //子节点 int s=a[u][i];dfs(s);//递归儿子for(int j=V;j>=v[u];j--)    //体积for(int k=0;k<=j-v[u];k++)//决策f[u][j]=max(f[u][j],f[u][j-k]+f[s][k]);}
}

树的重心

重心的定义

重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个结点被称为树的重心。

要求:

找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

代码
int dfs(int u)
{vis[u] = true;int size = 0;//记录u的最大子树的结点数;int sum = 1;//记录以u为根的子树的结点数:for (int i = h[u]; i != -1; i = ne[i]) {//i是边的编号int j = e[i];//j是u的邻接点if (vis[j]) continue;//避免向上搜索int s = dfs(j);//s是以j为根的字数的节点数size = max(size, s);//记录u的最大子树的结点数sum += s;//累加u的各个子树的结点数}ans = min(ans, max(size, n - sum)); //n-sum u上面的部分的结点数:return sum;
}

树的最长路径

找到一条路径,使得路径两端点的距离最远。

思路:找到从根节点向下走的最长路径和次长路径加起来

int dfs(int u)
{vis[u] = true;int d1 = 0;//最长int d2 = 0;//次长for (int i = h[u]; i != -1; i = ne[i]) {int j = e[i];//j是u的临界点if (vis[j]) continue;int d = dfs(j) + w[i];//从u经过j点往下走的最大长度if (d >= d1)//比最长还要长{d2 = d1;d1 = d;}else if (d > d2) {d2 = d;}}ans = max(ans, d1 + d2);return ans;
}

树的中心

定义

该点到树中其他点的最远距离最近

思路

分类处理

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据分享—鄱阳湖矢量边界数据

鄱阳湖位于中国江西省北部&#xff0c;是中国最大的淡水湖泊之一&#xff0c;也是长江流域第一大湖。鄱阳湖水域广阔&#xff0c;湖区面积约为3600平方公里。鄱阳湖拥有丰富的水生生物资源&#xff0c;湖中有多种淡水鱼类和水生植物&#xff0c;是重要的渔业资源基地之一。湖泊…

WHAT - CSS Animationtion 动画系列(二)

目录 一、循环波浪二、关键帧呼应三、关键帧顺接四、利用 transform-origin 做拉伸五、大元素可拆分多个小元素联动六、预留视觉缓冲七、随机感&#xff1a;动画周期设置八、抛物线&#xff1a;两个内外div实现x和y向量运动 今天我们主要学习动画实现要素。 一、循环波浪 利用…

LLM推理入门指南③:剖析模型性能

在本系列文章《LLM推理入门指南①&#xff1a;文本生成的初始化与解码阶段》中&#xff0c;作者对Transformer解码器的文本生成算法进行了高层次概述&#xff0c;着重介绍了两个阶段&#xff1a;提示的处理阶段和逐个生成补全词元的多步生成阶段。在上一篇文章《LLM推理入门指南…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时&#xff0c;格式不一样 比如 当右键单击时&#xff0c;然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪&#xff0c;就pdf的格式比较靠谱一点

愿岁月温柔以待你,爱你不止三千遍│活动进行中:以AI之名,时光陪伴

愿岁月温柔以待你&#xff0c;爱你不止三千遍│活动进行中&#xff1a;以AI之名&#xff0c;时光陪伴 在这个充满温馨的母亲节&#xff0c;我们很高兴地宣布&#xff0c;星鸾云A平台推出了一项特别活动&#xff1a;“以AI之名&#xff0c;时光陪伴”。我们相信&#xff0c;科技…

该从哪些方面提升系统的吞吐量?

更多大厂面试内容可见 -> http://11come.cn 该从哪些方面提升系统的吞吐量&#xff1f; 我们平时自己做的项目一般没有用户量&#xff0c;都是练手项目&#xff0c;所以并不会在吞吐量上做出很多的优化&#xff0c;但是这样的话&#xff0c;又会导致项目和其他人相比并没有…

机器学习(1)

目录 1-1.西瓜书 1-2.课程定位 1-3.机器学习 1-4.典型的机器学习过程 1-5.机器学习理论 1-6.基本术语 1-7.归纳偏好 1-8.NFL定理 1-1.西瓜书 建议使用方式 1.初学机器学习的第一本书:通读、速读;细节不懂处略过&#xff0c;了解机器学习的疆域和基本思想&#xff0c;…

电路板维修【三】

自恢复保险丝&#xff1a; 自恢复保险丝属于慢断类型保险丝&#xff0c;自恢复保险丝的材料因为通电后发热&#xff0c;当电流过大发热到一定程度的时候&#xff0c;材料就不导电了&#xff0c;这个和普通的保险丝是一个道理&#xff0c;只不过普通的保险丝是一次型熔断而已。…

pair对组创建

创建方式1: pair<type,type> p(value1,value2); pair<string, int> p("Tom", 20); cout << "name:" << p.first << "age:" << p.second << endl; 创建方式2: pair<type,type> pmake_pair(v…

妙笔生花,创作无限——WonderPen妙笔 for Mac

写作&#xff0c;是灵感的流淌&#xff0c;是心灵的独白。WonderPen妙笔 for Mac&#xff0c;为您的灵感插上翅膀&#xff0c;让您的创作更加流畅自如。它拥有简洁直观的界面设计&#xff0c;让您的思绪在纯净的写作环境中自由飞翔。多种写作模式&#xff0c;满足您不同的创作需…

OFDM802.11a的FPGA实现(十三)加窗(含verilog和matlab代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 1.前言 添加循环前缀后,对数据还要进行加窗(Windowing)操作。加窗操作可以使OFDM 符号在带宽之外的功率谱密度下降得更快。 2.加窗 对OFDM符号“加窗”意味着令符号周期边缘的幅度…

基于python的旅游爬虫可视化与实现

摘要 本项目为基于python的旅游爬虫可视化的设计与实现&#xff0c;项目以Web系统形式展示&#xff0c;利用Xpath爬虫爬取去哪儿网针对旅游业的需求&#xff0c;对国内热门旅游景点数据可视化系统&#xff0c;将爬取好的数据保存为CSV文件&#xff0c;再通过ORM框架导入MySQL数…

软件库V1.5版本iApp源码V3

软件库V1.5版本iApp源码V3 配置教程在【mian.iyu】的【载入事件】 更新内容&#xff1a; 1、分类对接蓝奏&#xff08;免费&#xff0c;付费&#xff0c;会员&#xff0c;广告&#xff09;&#xff0c;支持蓝奏文件描述设置为简介&#xff08;改动&#xff1a;首页.iyu&#…

【信道编码】2 卷积码、状态转移图、状态转移表、网格表示和码字路径

【信道编码】2 卷积码、状态转移图、状态转移表、网格表示和码字路径 写在最前面例题先行&#xff0c;原理随后示例&#xff1a;输入为01011100状态转移表状态转移图 卷积码的原理原理与结构工作流程误差纠正 &#xff08;2,1,2&#xff09;卷积编码器工作原理结构和示例状态转…

【神经网络】输出层的设计

文章目录 前言一、恒等函数和softmax函数恒等函数softmax 函数python实现softmax函数 二、实现softmax函数时的注意事项函数优化python实现 三、softmax函数的特征计算神经网络的输出输出层的softmax函数可以省略“学习”和“推理”阶段 四、输出层的神经元数量 前言 神经网络…

【SpringMVC 】什么是SpringMVC(三)?基于springmvc的文件上传、基于springmvc的拦截器、基于springmvc的邮件发送

文章目录 SpringMVC第五章1、SpringMVC文件上传1、基本步骤1-2345-82、邮件发送1、基本步骤1-234-5567-8 简单邮件带附件的邮件第六章1、拦截器的使用使用步骤232、调度的使用基本步骤1-56-8调度规则3、shiro安全框架核心概念基本语法1、基于ini文件的认证**测视类**2、基于rea…

【系统架构师】-选择题(十三)数据库基础

1、在某企业的营销管理系统设计阶段&#xff0c;属性"员工"在考勤管理子系统中被称为"员工"&#xff0c;而在档案管理子系统中被称为"职工"&#xff0c;这类冲突称为&#xff08; 命名冲突&#xff09;。 同一个实体在同系统中存在不同的命名&am…

用户登录:断点看流程认证

参考原文Security认证流程 第一步:先认识一下令牌 开始断点 执行new UsernamePasswordAuthenticationToken 1.Authentication接口: 它的实现类&#xff0c;表示当前访问系统的用户&#xff0c;封装了用户相关信息。(我们实现类是UsernamePasswordAuthenticationToken) 点击…

【ARM 嵌入式 C 入门及渐进 16.1 -- C 代码实现CRC32校验函数】

请阅读【嵌入式开发学习必备专栏】 文章目录 CRC32校验函数CRC32 表与函数CRC32 测试函数测试结果 对比测试结果 CRC32校验函数 在C语言中&#xff0c;实现CRC32计算的函数需要一个CRC算法的实现。以下是一个使用查表法实现CRC32的简单例子。这种方法通过预先计算好的CRC表来快…

windows编译opencv4.9

opencv很多人在windows上编译感觉特别麻烦&#xff0c;没有linux下方便&#xff0c;设定以下三点&#xff0c;我们几乎会无障碍。 1 安装cuda&#xff0c;cudnn 安装好cuda&#xff0c;cudnn&#xff0c;把cudnn的头文件&#xff0c;库等等拷贝到cuda的安装目录下面&#xff…