不同的二叉搜索树 01背包

96.不同的二叉搜索树

力扣题目链接(opens new window)

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]

dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]

dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]

j相当于是头结点的元素,从1遍历到i为止。

所以递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量

空节点也是一棵二叉树,所以初始化dp[0] = 1,dp[1]能从dp0推出来所以不用初始化

实际上这道题应该这样理解,对于数值是 n 的二叉搜索树的个数,等于 以 1-n 的数值为头结点的个数相加。这一步相信大家都没啥问题。那么后面对于每一个头结点,该怎样去算呢?
举例,n 为 7,那么当头结点是 5 的时候,将 1,2,3,4,6,7 这几个数字放进去,根据二叉搜索树定义,左子树小右子树大,那么 1,2,3,4只能在左子树,6,7在右子树中,也就是说 左子树由四个数构成一颗二叉搜索树,右子树有两个数构成一颗二叉搜索树,这里右子树的 6,7 可以看成 1,2,因为把头结点 5 不看的话,1,2 构成的二叉搜索树和 6,7 构成的二叉搜索树的个数是一样的。这也是为什么只要布局相似即可。那么再看 方程 dp【i】 += dp【j - 1】 * dp【i - j】,把 i = 7,j = 5 带入,其实就是 dp【4】 * dp【2】 , 这里的 4 是个数,2 也是个数。

class Solution {
public:int numTrees(int n) {vector<int> dp(n + 1);dp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {dp[i] += dp[j - 1] * dp[i - j];}}return dp[n];}
};

动态规划:01背包理论基础

本题力扣上没有原题,大家可以去卡码网第46题 (opens new window)去练习,题意是一样的。

dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少

递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

对应放入i物品 和不放入i物品 取价值大

初始化:初始化第一行和第一列  剩下的随意初始化 因为剩下的每一个数都是通过这个数的上面的和左斜上方推出来的。

#include <bits/stdc++.h>
using namespace std;int n, bagweight;// bagweight代表行李箱空间
void solve() {vector<int> weight(n, 0); // 存储每件物品所占空间vector<int> value(n, 0);  // 存储每件物品价值for(int i = 0; i < n; ++i) {cin >> weight[i];}for(int j = 0; j < n; ++j) {cin >> value[j];}// dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));// 初始化, 因为需要用到dp[i - 1]的值// j < weight[0]已在上方被初始化为0// j >= weight[0]的值就初始化为value[0]for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];}for(int i = 1; i < weight.size(); i++) { // 遍历科研物品for(int j = 0; j <= bagweight; j++) { // 遍历行李箱容量// 如果装不下这个物品,那么就继承dp[i - 1][j]的值if (j < weight[i]) dp[i][j] = dp[i - 1][j];// 如果能装下,就将值更新为 不装这个物品的最大值 和 装这个物品的最大值 中的 最大值// 装这个物品的最大值由容量为j - weight[i]的包任意放入序号为[0, i - 1]的最大值 + 该物品的价值构成else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);}}cout << dp[weight.size() - 1][bagweight] << endl;
}int main() {while(cin >> n >> bagweight) {solve();}return 0;
}

01背包理论基础(滚动数组)

在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。

递推式:

不放物品i,所背的背包最大价值还是dp【j】相当于从上一层的数组拷贝过来(滚动)

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

dp[0]就应该是0,因为背包容量为0所背的物品的最大价值就是0。

倒序遍历背包容量 :

因为二维数组是根据左上元素来求的,一维数组自然就是靠左边来求的。倒序的时候左边元素再刷新前都是上一层的数据,但正序就不一样了,正序的时候,左边的元素刚刚刷新过,也就是左边的元素已经是本层的了,意味着什么 这样会导致一个物品反复加好几次。

void test_1_wei_bag_problem() {vector<int> weight = {1, 3, 4};vector<int> value = {15, 20, 30};int bagWeight = 4;// 初始化vector<int> dp(bagWeight + 1, 0);for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}}cout << dp[bagWeight] << endl;
}int main() {test_1_wei_bag_problem();
}

j>=weight[i] 背包容量要大于本次刚入的物品

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

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

相关文章

Vivado2021及以下版本 HLS生成IP核报错的解决方案

摘要&#xff1a;生成 HLS ip的时候会报错&#xff0c;无法生成&#xff1b;原因是2021及以下的版本都会有时间错误的问题&#xff0c;所以要用官方的补丁包&#xff0c;但是打了补丁包有时候也会没用 一、打补丁 以下是xilinx提供的解决办法&#xff1a; Export IP Invalid …

振弦采集仪在岩土工程施工质量监控中的应用案例分析

振弦采集仪在岩土工程施工质量监控中的应用案例分析 河北稳控科技振弦采集仪是一种用来监测振动的仪器设备&#xff0c;可以通过采集振弦信号来分析结构的振动特性。在岩土工程施工质量监控中&#xff0c;振弦采集仪可以用于以下几个方面的应用。 1. 地基与基础工程监测&#…

11.Java---语法总结之一个小项目

图书管理系统 Java学习了很久了,今天将运用之前学习的所有东西整理做个小小的小项目. 1.首先是各种包和操作方法建好 2.然后是项目的大框架搭好 3.然后就开始实现各个部分了 看看最后的运行结果吧! 管理员测试 1.登录&显示图书的运行结果 2.查找&新增图书的运行结…

【黑马程序员】python函数

文章目录 函数什么是函数为什么学习函数函数定义函数的传入参数函数的返回值返回值基础None返回值 函数说明文档函数的嵌套调用定义代码示例 全局变量和局部变量全局变量global变量局部变量 函数综合案例 函数 什么是函数 组织好的&#xff0c;可重复使用的、用来实现特定功能…

图像分割损失函数

为什么要乘以2&#xff0c;是为了让DICE的值域在0和1之间 优化&#xff1a;两种LOSS相加 Focus loss:

【PLSQL】plsqldeveloper查询结果记录显示不全

plsql版本号为12或13。 例如scott用户的emp表中共有14条数据&#xff0c;但select * from emp;查询结构只显示13条记录&#xff0c;如下&#xff1a; 这是由于查询结果显示条数&#xff0c;根据查询框高度自动计算可以显示多少条记录&#xff0c;如果想显示全&#xff0c;则需…

阿里云领盲盒活动

阿里云每次的活动都很给力&#xff0c;实打实地发东西。 这次是体验 通义灵码 的活动&#xff0c;这个是体验的推广链接 「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 我是在vscode安装的&#xff0c;体验还行&#xff0c;抽奖抽到了马克杯 这个是抽奖的具体步骤 https:…

程序猿成长之路之socket篇-socket通信原理简介

hello,各位小伙伴们大家好&#xff0c;上次以RSA加解密算法介绍作为密码学篇的结尾后&#xff0c;时光飞逝&#xff0c;转眼到了新一年的春季&#xff0c;这次将介绍一下socket通信和编程原理。 什么是socket&#xff08;套接字&#xff09;&#xff1f; socket&#xff08;套…

Matlab|【分布鲁棒】数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法

目录 主要内容 1.1 主要难点-分布鲁棒优化 1.2 程序求解步骤-主子问题迭代 部分结果 下载链接 主要内容 本程序主要对《基于场景聚类的主动配电网分布鲁棒综合优化》-高海淑的方法复现&#xff0c;应用到综合能源电热微网方向&#xff0c;采用拉丁超立方抽样对不同…

[计算机效率] 在当前文件夹以管理员身份运行批处理

2.7 在当前文件夹以管理员身份运行批处理 这个功能对于要经常运行批处理程序的人来说真的很方便。每次要要运行批处理&#xff0c;要么就是直接打开的批处理不是以管理员身份运行的&#xff0c;要么就是在批处理中要一步步的切换进入到目标文件夹中&#xff0c;非常费时间。 方…

录屏直播技巧大揭秘,轻松捕捉精彩瞬间

录屏直播作为一种流行的线上内容创作方式&#xff0c;备受关注。无论是游戏主播、教程讲解还是线上会议&#xff0c;录屏直播都能轻松应对。本文将介绍三种录屏直播方法&#xff0c;并对其进行分步骤详细说明&#xff0c;帮助读者轻松掌握录屏直播的技巧&#xff0c;为内容创作…

c语言 线性搜索算法

线性搜索被定义为一种顺序搜索算法&#xff0c;从一端开始&#xff0c;遍历列表中的每个元素&#xff0c;直到找到所需的元素&#xff0c;否则搜索将继续&#xff0c;直到数据集的末尾。 线性搜索算法 线性搜索算法如何工作&#xff1f; 在线性搜索算法中&#xff1a; …

Linux VM虚拟环境 设置静态IP

目录 查看自己的网卡配置说明重启网卡实例测试配置情况测试网络 查看自己的网卡 ip a配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens32配置说明 [rootlinux-server ~]# cd /etc/sysconfig/network-scripts/ #网卡配置文件存放路径 [rootlinux-server network-scri…

凡得首席战略官蔡聪,将出席“ISIG-流程挖掘技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;RPA中国、AIGC开放社区、LowCode低码时代&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索R…

开源导出html表格项目-easyHtml

开源导出html表格项目-easyHtml 背景介绍 背景 项目的由来&#xff0c;在面试的过程中&#xff0c;发现这个需求&#xff08;导出html表格&#xff09;比较常见&#xff0c;同时也引起我的兴趣&#xff0c;所以就有了开源项目easyHtml第一个版本 介绍 功能 支持自定义表格标…

【JavaScript 漫游】【035】同源限制

文章简介 本篇文章为【JavaScript 漫游】专栏的第 035 篇文章&#xff0c;记录了浏览器模型同源限制相关的知识点。 概述 浏览器安全的基石是“同源政策”&#xff08;same-origin policy&#xff09;。1995 年&#xff0c;该政策由 Netscape 公司引入浏览器。目前&#xff…

云服务器与传统服务器价格对比

在信息化时代&#xff0c;服务器作为企业数据存储和计算的核心设备&#xff0c;扮演着举足轻重的角色。传统的物理服务器与近年来兴起的云服务器在功能、性能、安全性等方面各有千秋&#xff0c;而价格则是企业在选择时不得不考虑的重要因素。本文将简要科普云服务器与传统服务…

[答疑]AI能做“需求分析”吗+警惕造词圈子割韭菜

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第五元素 2024-3-10 21:02 潘老师&#xff0c;AI热度不减&#xff0c;现在sora出来更是火爆。有些在github上有几万star的程序员&#xff0c;宣称能用AI做“需求分析”&#xff0c;好…

TCP/IP协议栈

TCP/IP协议栈&#xff08;Transmission Control Protocol/Internet Protocol Suite&#xff09;是互联网上进行数据通信的一系列网络协议的集合&#xff0c;它是现代计算机网络通信的基础架构。 它由多个不同的协议层构成&#xff0c;每层负责不同层面的数据处理和传输工作&…

京津冀协同发展:北京·光子1号金融算力中心——智能科技新高地

京津冀协同发展是党中央在新的历史条件下提出的一项重大国家战略&#xff0c;对于全面推进“五位一体”总体布局&#xff0c;以中国式现代化全面推进强国建设、民族复兴伟业&#xff0c;具有重大现实意义和深远历史意义。随着京津冀协同发展战略的深入推进&#xff0c;区域一体…