算法系列--动态规划--特殊的状态表示--分析重复子问题(下)

简介: 算法系列--动态规划--特殊的状态表示--分析重复子问题(下)

算法系列--动态规划--特殊的状态表示--分析重复子问题(上)

https://developer.aliyun.com/article/1480868?spm=a2c6h.13148508.setting.14.5f4e4f0esd7oUU

💕"轻舟已过万重山!"💕

作者:Lvzi

文章主要内容:算法系列–算法系列–动态规划–特殊的状态表示–分析重复子问题

大家好,今天为大家带来的是算法系列--动态规划--特殊的状态表示--分析重复子问题

代码:

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])
                    dp[i] += dp[i - nums[j]];
        return dp[target];
    }
}

根据状态表示可以推导出最后应该返回的结果为总和为target的所有排列方式,但是这些排列方式的组合中必须包含数组中的数字

二.不同的二叉搜索树

链接:

https://leetcode.cn/problems/unique-binary-search-trees/

分析:

做之前一定要知道什么是二叉搜索树,二叉搜索树是指一课二叉树的所有子树都满足left < root < right

本题同样也可以采用在分析问题的时候,发现重复的子问题,并抽象出状态表示的分析方法

这里的重复子问题就是选择一个数作为根节点之后,统计其所有的情况,一直统计完所有的数

状态表示:

  • dp[i]:结点的个数为i时,一共有多少种二叉搜索树

状态转移方程:

初始化:

  • dp[0] = 1:空树也算是二叉搜索树

代码:

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];
    }
}

分别以数组中的每一个数作为根节点的值,判断有多少种二叉搜索树

动态规划的系列就此完结!


目录
相关文章
|
27天前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
51 4
|
22天前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
53 2
动态规划算法学习三:0-1背包问题
|
10天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
22天前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
57 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
22天前
|
算法
动态规划算法学习二:最长公共子序列
这篇文章介绍了如何使用动态规划算法解决最长公共子序列(LCS)问题,包括问题描述、最优子结构性质、状态表示、状态递归方程、计算最优值的方法,以及具体的代码实现。
85 0
动态规划算法学习二:最长公共子序列
|
16天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
22天前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
22天前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
82 0
|
30天前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
30 0
|
1月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)