动态规划(组合总和+不同的二叉搜索树)

news2024/9/23 17:23:36

一)组合总和

377. 组合总和 Ⅳ - 力扣(LeetCode)

排列:所有情况是有序的

组合:所有情况是无序的

一)定义一个状态表示:

有限制条件下的组合问题:

1)dp[i][j]表示从前i个物品中进行挑选,总体积不超过j,所有的选法中,要的是最大的价值

但是这个状态表示没有规定挑选的顺序,第一个位置挑选什么,第二个位置挑选什么,仅仅是在所有的选法中要的是最大的价值,因此在这些选发中本质上是没有顺序的,所以背包问题本质上解决的是一个组合问题,因此此排列问题不能用背包问题解决;

2)这道题非常像背包问题,依旧是给定一些数从里面挑,限定条件就是目标和,每一个数都是可以无限使用的,因此这个题非常像完全背包问题

3)之前在做动态规划的时候,定义状态标识都是使用线性dp来进行解决的,或者是以区间dp来进行解决的,以某一个位置为结尾巴拉巴拉,以某一个位置为起点巴拉巴拉,或者是选取一段区间,巴拉巴拉

4)还可以根据分析问题的过程中,发现重复子问题,抽象出来一个状态表示,

dp[i]就表示凑成组合数是i,一共有多少种排列数

二)根据状态标识推到状态转移方程:

1)dp[i]=dp[i-nums[j]],以j位置为结尾,要找的是总和为i的最小排列数,那么只是需要去总和为i-nums[i]的排列数即可

2)在所有总和是i-nums[j]为结尾的所有情况中后面拼接上一个nums[j]即可

3)dp[i]+=dp[i-nums[j]](i>=nums[j])

 

 三)初始化+填表顺序(从左向右)+返回值(dp[target])

dp[0]表示从选择组合数是0的方案个数,什么都不选,选择一个1个空集,就是一种方案,所以dp0]=1,如果初始化等于0,那么根据状态转移方程,后面的数都是等于0的

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp=new int[target+1];
        dp[0]=1;
        for(int i=1;i<=target;i++){
            for(int j=0;j<nums.length;j++){
                if(i-nums[j]>=0)
                dp[i]+=dp[i-nums[j]];
            }
        }
    return dp[target];
    }
}

二)不同的二叉搜索树

96. 不同的二叉搜索树 - 力扣(LeetCode)

左子树<根节点<右子树

一)定义一个状态表示在分析问题的过程中发现重复子问题,抽象出来一个状态标识

之前想看看有5个结点的时候一共有多少种二叉搜索树,但是当我固定完成一个根节点3的时候左子树有两个节点的时候有多少种二叉搜索树,右子树有两个结点的时候有多少种二叉搜索树,所以分析思路就是当某一个节点是某一个数的时候,左子树是N-1个结点的时候有多少种二叉搜索树,右子树是i-(n-1)个结点的时候有多少种二叉搜索树

所以dp[i]就表示以节点个数为i的时候一共有多少种二叉搜索树

二)根据状态标识推到状态转移方程:

1)当我们进行选择节点数是i的时候一共有多少种二叉搜索数,那么1-i中间的数都是有可能充当根节点的

2)根节点是j,左边的节点个数是dp[j-1],右边的节点个数是dp[i-j],所以当根节点是j的时候,左子树的节点数量是j-1,右子树的节点数量就是i-j;

三)初始化

dp[0]=1,当节点个数是0的时候,就是一颗空树,空树也是可以被认为是一种二叉搜索树

如果你的dp[0]!=1的话,那么根据你的状态转移方程后面的值都是0

class Solution {
    public int numTrees(int n) {
     int[] dp=new int[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];
    }
}

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

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

相关文章

wxwidgets Ribbon使用简单实例

// RibbonSample.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <wx/wx.h> #include "wx/wxprec.h" #include "wx/app.h" #include "wx/frame.h" #include "wx/textctrl.h" #include "…

Linux中的pause函数

2023年7月29日&#xff0c;周六上午 函数原型 在Linux中&#xff0c;pause()函数用于使当前进程暂停执行&#xff0c;直到接收到一个信号。 #include <unistd.h>int pause(void);pause()函数不接受任何参数。 通常&#xff0c;pause()函数用于编写简单的信号处理程序&…

管理类联考——写作——实战篇——结构篇——不同角度

角度1——两种结构 人类面临的所有问题就是&#xff1a; 是什么? 为什么? 好不好(意义)? 怎么办? 结构引领思路&#xff1a; 想什么&#xff0c;比做什么更重要 怎么想&#xff0c;比想什么更重要 提纲挈领&#xff0c;纲举目张。先抓纲领&#xff0c;纲即结构&#xff…

SQL注入实操三(SQLi-labs 31-40)

文章目录 一、sqli-labs靶场1.轮子模式总结2.Less-31 FUN with WAFa.注入点判断b.轮子测试c.获取数据库名称d.获取表信息e.获取列信息f.获取表内数据 3.Less-32 Bypass addslashes()a.注入点判断b.轮子测试c.获取数据库名称d.获取表信息e.获取列信息f.获取表内数据 4.Less-33a.…

openGauss学习笔记-24 openGauss 简单数据管理-模式匹配操作符

文章目录 openGauss学习笔记-24 openGauss 简单数据管理-模式匹配操作符24.1 LIKE24.2 SIMILAR TO24.3 POSIX正则表达式 openGauss学习笔记-24 openGauss 简单数据管理-模式匹配操作符 数据库提供了三种独立的实现模式匹配的方法&#xff1a;SQL LIKE操作符、SIMILAR TO操作符…

秸秆变建材 | 更低碳,更高效!

秸秆是农作物收割后的残余资源&#xff0c;作为建材使用历史悠久。早在1886年美国内布拉斯加州就有了秸秆建筑。 其后秸秆建筑经历了两个发展高峰期&#xff1a;在第一个高峰期&#xff0c;1905年德国将麦秸和胶黏剂混合制成板材&#xff1b;1920年美国路易安那州建立了蔗渣制板…

【业务功能篇58】Springboot + Spring Security 权限管理 【中篇】

4.2.3 认证 4.2.3.1 什么是认证&#xff08;Authentication&#xff09; 通俗地讲就是验证当前用户的身份&#xff0c;证明“你是你自己”&#xff08;比如&#xff1a;你每天上下班打卡&#xff0c;都需要通过指纹打卡&#xff0c;当你的指纹和系统里录入的指纹相匹配时&…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 26 日论文合集)

文章目录 一、检测相关(7篇)1.1 Personal Protective Equipment Detection in Extreme Construction Conditions1.2 RecursiveDet: End-to-End Region-based Recursive Object Detection1.3 Re-mine, Learn and Reason: Exploring the Cross-modal Semantic Correlations for L…

【每日一题】—— A - 1-2-4 Test (AtCoder Beginner Contest 270)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

操作系统的概念、并发和并行的区别、操作系统的发展和分类

操作系统 一、操作系统的概念1.1操作系统作为系统资源的管理者1.2向上层提供方便易用的服务1.2.1 联机命令接口&#xff08;交互式命令接口&#xff09;1.2.2 脱机命令接口&#xff08;批处理命令接口&#xff09;1.2.3程序接口 1.3最接近硬件的一层软件 二、操作系统的特征2.1…

renderjs 与 app-vue之间数据交互

renderjs 与 app-vue之间数据传值 文章目录 renderjs 与 app-vue之间数据传值renderjs效果图templatejs renderjs renderjs renderjs 的主要作用&#xff1a; 大幅降低逻辑层和视图层的通讯损耗&#xff0c;提供高性能视图交互能力在视图层操作dom&#xff0c;运行 for web 的…

1400*C. Phoenix and Towers(贪心)

题意&#xff1a; 将 n 个数字分成 m 组&#xff0c;使得每两组的差值都不超过 x &#xff0c;打印每个数的分组的组数 解析&#xff1a; 因为每一个数都不超过 x &#xff0c;所以两个数的差值必定不超过 x&#xff0c;每次选最矮的一座塔放入当前的砖块&#xff0c;并且记录塔…

iOS开发-下拉刷新动画小球左右交换位置Indicator指示器效果

iOS开发-下拉刷新动画小球左右交换位置Indicator指示器效果 之前开发中实现下拉刷新动画小球左右交换位置Indicator指示器效果。 一、效果图 二、基础动画 CABasicAnimation类的使用方式就是基本的关键帧动画。 所谓关键帧动画&#xff0c;就是将Layer的属性作为KeyPath来注…

Linux:shell命令运行原理和权限的概念

文章目录 shell和kernelshell的概念和原理Linux的权限文件的权限文件的类型文件的权限管理权限的实战应用 shell和kernel 从狭义上来讲&#xff0c;Linux是一个操作系统&#xff0c;我们叫它叫kernel&#xff0c;意思是核心&#xff0c;核心的意思顾名思义&#xff0c;就是最关…

【LeetCode】72.(最短)编辑距离(闫氏dp,分析加可视化)

考虑两个数组&#xff1a;a、b 定义dp[ i ][ j ]为&#xff0c;让数组a从1到 i 的字符&#xff0c;与数组b从1到 j 的字符&#xff0c;正好匹配上的最小操作数。 假设现在面前有一个正好匹配的数组a和b&#xff0c;其中a的长度为 i &#xff0c;b的长度为 j &#xff08;两个…

python离散仿真器

文章目录 类图示例 类图 示例

浅谈3D隐式表示(SDF,Occupancy field,NeRF)

本篇文章介绍了符号距离函数Signed Distance Funciton(SDF)&#xff0c;占用场Occupancy Field&#xff0c;神经辐射场Neural Radiance Field&#xff08;NeRF&#xff09;的概念、联系与区别。 显式表示与隐式表示 三维空间的表示形式可以分为显式和隐式。 比较常用的显式表…

基于SpringBoot+Vue的财务管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【动态规划part10】| 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

目录 &#x1f388;LeetCode121. 买卖股票的最佳时机 &#x1f388;LeetCode122.买卖股票的最佳时机II &#x1f388;LeetCode121. 买卖股票的最佳时机 链接&#xff1a;121.买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定…

图神经网络(GNN)入门学习笔记(直观且简单)

文章目录 图的定义和表示可以使用图数据结构的问题将图结构用于机器学习的挑战最基本的图神经网络概述汇聚操作基于信息传递的改进图神经网络全局向量信息的利用 本篇文章参考发表于Distill上的图神经网络入门博客&#xff1a; A Gentle Introduction to Graph Neural Network…