首页 > 编程语言 >(算法)最⻓递增⼦序列————<暴搜->记忆化搜索->动态规划>

(算法)最⻓递增⼦序列————<暴搜->记忆化搜索->动态规划>

时间:2024-08-13 23:23:37浏览次数:9  
标签:nums int max 递增 pos ret 算法 序列 memo

1. 题⽬链接:300.最⻓递增⼦序列

2. 题⽬描述:

3. 解法(暴搜->记忆化搜索->动态规划):

算法思路:

暴搜:

a. 递归含义:给dfs ⼀个使命,给他⼀个数i ,返回以i 位置为起点的最⻓递增⼦序列的⻓ 度;

b. 函数体:遍历i 后⾯的所有位置,看看谁能加到i 这个元素的后⾯。统计所有情况下的最⼤ 值。

c. 递归出⼝:因为我们是判断之后再进⼊递归的,因此没有出⼝~ 

记忆化搜索:

a. 加上⼀个备忘录;

b. 每次进⼊递归的时候,去备忘录⾥⾯看看;

c. 每次返回的时候,将结果加⼊到备忘录⾥⾯。

动态规划:

a. 递归含义->状态表⽰;

b. 函数体->状态转移⽅程;

c. 递归出⼝->初始化。

C++算法代码: 

class Solution
{
public:
	int lengthOfLIS(vector<int>& nums)
	{
		// 动态规划 
		vector<int>dp(nums.size(), 1); //记录每个位置之后的最长递增子序列
		int max_size = 0; //最大递增子序列长度
		for (int i = nums.size() - 1; i < nums.size(); i--)
		{
			//计算该位置之后的最长子序列长度
			for (int j = i + 1; j < nums.size(); j++)
			{
				if (nums[j] > nums[i])
				{
					dp[i] = max(dp[i], dp[j] + 1);
				}
			}
			//最大递增子序列长度
			max_size = max(max_size, dp[i]);
		}
		return max_size;
			// 记忆化搜索 
			// 
			// vector<int> memo(n);
			// int ret = 0;
			// for(int i = 0; i < n; i++)
			// ret = max(ret, dfs(i, nums, memo));
			// return ret;
	}
	int dfs(int pos, vector<int>& nums, vector<int>& memo)
	{
		if (memo[pos] != 0) return memo[pos];
		int ret = 1;
		for (int i = pos + 1; i < nums.size(); i++)
		{
			if (nums[i] > nums[pos])
			{
				ret = max(ret, dfs(i, nums, memo) + 1);
			}
		}
		memo[pos] = ret;
		return ret;
	}
};

 Java算法代码:

class Solution
{
	public int lengthOfLIS(int[] nums)
	{
		int n = nums.length;
		int[] dp = new int[n];
		int ret = 0;
		Arrays.fill(dp, 1);
		// 填表顺序: 从后往前 
		for (int i = n - 1; i >= 0; i--)
		{
			for (int j = i + 1; j < n; j++)
			{
				if (nums[j] > nums[i])
				{
					dp[i] = Math.max(dp[i], dp[j] + 1);
				}
			}
			ret = Math.max(ret, dp[i]);
		}
		return ret;

		// 记忆化搜索 
		// int ret = 0;
		// int n = nums.length;
		// int[] memo = new int[n];
		// for(int i = 0; i < n; i++)
		// {
		// ret = Math.max(ret, dfs(i, nums, memo));
		// }
		// return ret;
	}
	public int dfs(int pos, int[] nums, int[] memo)
	{
		if (memo[pos] != 0) return memo[pos];
		int ret = 1;
		for (int i = pos + 1; i < nums.length; i++)
		{
			if (nums[i] > nums[pos])
			{
				ret = Math.max(ret, dfs(i, nums, memo) + 1);
			}
		}
		memo[pos] = ret;
		return ret;
	}
}

标签:nums,int,max,递增,pos,ret,算法,序列,memo
From: https://blog.csdn.net/2301_79580018/article/details/141160656

相关文章

  • 代码随想录算法训练营第二十八天 | 122.买卖股票的最佳时机II , 55. 跳跃游戏 , 45.跳跃
    目录122.买卖股票的最佳时机II 思路方法一:贪心方法二:动态规划55.跳跃游戏思路方法一:使用while循环方法二:使用for循环45.跳跃游戏II 思路方法一方法二方法一:贪心方法一方法二:贪心方法二 方法三:贪心方法三心得体会1005.K次取反后最大化的数组和思路方法......
  • 数学:素性测试算法
    算法简介对一个数的素性测试有很多种做法,有确定性测试的算法,也有概率性测试的算法。确定性素性测试算法确定性素性测试这里介绍两种:线性筛法:利用线性筛在\(O(n)\)的时间复杂度内,将一个范围内的数素性全部求出,然后\(O(1)\)查询。试除法:在\(\sqrt{n}\)内试商,判定是否......
  • 代码随想录算法训练营第十四天(一)| 226.翻转二叉树 101. 对称二叉树
    226.翻转二叉树题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在 [0,100] 内-100<=......
  • SciTech-BigDataAIML-LLM-Transformer Series系列: Word Embedding词嵌入详解: 用Corp
    SciTech-BigDataAIML-LLM-TransformerSeries系列:WordEmbedding词嵌入详解:1.用Corpus预训练出嵌入矩阵\(\largeE\)CorpusCollecting:非常重要的工作先收集一个常用的Corpus(语料库),能保障大多数的word都在corpus.有两个特别重要的作用:VocabularyExtracting:词......
  • Java数组06:常见排序算法
    1.冒泡排序冒泡排序(BubbleSort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完......
  • 字符串算法
    KMP算法前言update2024.7.31今天重写了一篇KMP板子,之前是蒟蒻(现在也是),写的都是什么鬼,甚至没过模板题。感觉KMP优化没什么用,但是暂时保留吧。简介用模式串匹配文本串(主串)。对于一个模式串,找出每个位置的border(最长相等的前缀后缀),即为\(next\)数组。失陪时就跳到bord......
  • 最短路算法
    存在最短路的前提不存在负环。链接还是OIWiki好啊~~Floyd算法两两间最短路,可判负环。时间复杂度\(O(n^3)\)。像DP的思路一样。设\(f_{k,x,y}\)表示允许经过\(1\simk\)的点,\(x\toy\)的最短距离。\(O(n^3)\)的DP即可。按照\(k,x,y\)的顺序循环,每次与\(......
  • Python实现PID算法
    目录1.PID算法简介2.PID控制器的数学表达式3.Python实现PID算法场景:温度控制4.代码解释5.场景说明6.总结1.PID算法简介PID算法(Proportional-Integral-DerivativeControl)是经典的控制算法之一,广泛应用于自动控制系统中。PID控制器通过调节控制对象的输入,来实现对......
  • Python实现基因遗传算法
    目录基因遗传算法简介基因遗传算法的基本步骤Python实现基因遗传算法场景:优化二次函数Python代码实现代码解释场景说明总结基因遗传算法简介基因遗传算法(GeneticAlgorithm,GA)是一种基于自然选择和遗传学原理的优化算法,适用于求解复杂的组合优化问题。它通过模拟......
  • STL heap 算法库 堆操作
    算法库-堆操作基本操作make_heap()(1)从一个元素范围创建出一个最大堆(2)将区间内的元素转化为heap.--传比较器push_heap()对heap增加一个元素.将一个元素加入到一个最大堆pop_heap()对heap取出下一个元素.从最大堆中移除最大元素sort_heap()对heap转化为一......