`
Dev|il
  • 浏览: 126938 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

求序列中最长递增子序列的长度

阅读更多
#include <stdio.h>
#define MAXNUM 100
/*
函数功能:求解序列中的最大递增子序列的中包含的元素个数
算法说明:用到了动态规划问题,分解子问题b数组是用来存储每一个子序列中的最大递增子序列
求具有n个元素的序列中的最大递增自序列问题分解为
a[0], a[0] a[1], a[0] a[1] a[2], a[0] a[1] a[2]...a[m] m< n个子序列求其中的最大递增子序列
a[0]显然是递增的 所以b[0] = 1
a[0] a[1]求其中的最大递增自序列要依靠 a[0]如果 b[0] + 1 > max则让max = b[0]
动态规划使用条件:
1. a[0]是递增的 最大递增自序列元素个数为1 是确定的 最优的
2. a[0]....a[j] (j < n) 最大递增子序列的元素个数依赖于 a[0]...a[j - 1]的最大子序列 只对当前状态保持最优
依次递推下去 a[0]....a[j]也是最优的
*/
int main()
{
	int a[MAXNUM], b[MAXNUM];
	int n, i, j, max;
	scanf("%d", &n);
	for(i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	b[0] = 1;
	for(i = 1; i < n; i++)
	{
		max = 0; //代表此次最大的升序列
		for(j = i - 1; j >= 0; j--)
		{
			if(a[j] < a[i] && max < b[j] + 1)
			{
				max = b[j];
			}
		}
		b[i] = max + 1;
	}
	max = b[0];
	for(i = 1; i < n; i++)
	{
		if(b[i] > max)
			max = b[i];
	}
	printf("最大子序列个数为:%d\n", max);
	return 0;
}
分享到:
评论

相关推荐

    最长递增子序列问题

    3. 在遍历结束后,`dp`数组中的最大值即为最长递增子序列的长度。若要获取具体序列,可以回溯`dp`数组。 **回溯获取LIS的过程:** 1. 找到`dp`数组中的最大值`max_len`和对应的索引`index`。 2. 从`index`开始,...

    最长递增子序列(原创C语言)

    这是我这两天才完成的原创代码,就是比较经典的求一个随机序列的最长递增子序列问题。例如: n=5 随机序列为 5 1 4 2 3,正确输出为1 2 3,即长度为3的递增子序列。里面附带实验详细说明,感兴趣的可以下来参考。 ...

    动态规划:最长单调递增子序列

    - 对于数组中的每一个元素 `a[i]`,初始时设 `d[i] = 1`,表示以 `a[i]` 结尾的最短递增子序列长度至少为 1。 2. **计算过程**: - 遍历数组中的每个元素 `a[i]`(从左到右)。 - 对于每一个 `a[i]`,再遍历之前...

    PTA丨最长连续递增子序列

    在这个例子中,`dp` 数组用于存储以每个元素结尾的最长递增子序列的长度,而 `max_len` 用于跟踪全局最长递增子序列的长度。时间复杂度为 O(n^2),空间复杂度为 O(n)。 了解了基本的动态规划解决方案后,还可以考虑...

    最长子序列什么是最长递增子序列呢

    3. 最终,数组 \( b \) 中的最大值即为所求的最长递增子序列长度。 **状态转移方程:** \[ b[k] = \max(\max(b[j] | a[j] [k], j ) + 1, 1) \] **时间复杂度分析:** - 内外两层循环的时间复杂度分别为 \( O(n) \)...

    求最长非递增子序列长度

    3. 结果:遍历结束后,dp数组中的最大值即为所求的最长非递增子序列的长度。 以下是C++代码示例: ```cpp #include using namespace std; int longestNonIncreasingSubsequence(vector&lt;int&gt;& nums) { int n = ...

    最长递增子序列 动态规划法.cpp.rar

    3. 记录最大值:在遍历过程中,记录下dp数组中的最大值,这将是整个数组的最长递增子序列长度。 4. 输出结果:最后,最长递增子序列的长度就是dp数组中的最大值。如果需要找到具体的子序列,可以通过回溯dp数组来...

    求出最长上升子序列中各个元素

    最长上升子序列是指在一个给定的序列中,找到一个子序列,要求这个子序列中的元素是严格递增的,并且它的长度最大。例如,在序列`[10, 9, 2, 5, 3, 7, 101, 18]`中,最长上升子序列有`[2, 3, 7, 101]`和`[10, 2, 5, ...

    最长递增子序列java源码

    在本实验中,我们将探讨如何使用Java编程语言解决“最长递增子序列”(Longest Increasing Subsequence, LIS)的问题。这是一个经典的动态规划问题,在计算机科学和算法设计中具有广泛的应用,例如在股票交易策略、...

    求一个整数序列的最长递增子序列.doc

    最长递增子序列(Longest Increasing Subsequence,简称LIS)是计算机科学中的一个重要问题,特别是在算法设计和分析中。它要求找到一个给定序列中的一个子序列,使得这个子序列是递增的,并且长度最长。 在给定的...

    最长递增子序列多种实现(java)

    对于LIS问题,我们可以创建一个长度等于序列长度的数组`dp`,其中`dp[i]`表示以第`i`个元素结尾的最长递增子序列的长度。初始化所有`dp[i] = 1`,然后遍历序列,对于每个元素,更新所有小于它的元素的`dp`值。 ```...

    求取最长递增子序列(MFC编程)

    最长递增子序列(Longest Increasing Subsequence, LIS)是计算机科学中一个经典的算法问题,主要涉及到了排序、数组处理和优化策略等概念。在这个场景中,我们将关注使用贪心算法和动态规划来解决这个问题,并结合...

    中科大算法导论课程实验 最长递增子序列 报告

    动态规划方法的核心在于为每一个子序列维护一个最长递增子序列的长度,通过比较和更新每个元素所能构成的最长递增子序列来得到整个序列的最长递增子序列。该方案具有较好的时间复杂度和空间复杂度,适用于较大规模的...

    最长递增子序列C程序

    3. 记录最大值:遍历结束后,`dp`数组中的最大值即为最长递增子序列的长度。 4. 反向追踪:为了获取实际的子序列,可以从`dp`数组的最大值开始,逆向查找每个元素的前驱,构建递增子序列。 在压缩包中的"FLS"文件...

    最长递增子序列LCS的实现C源码

    printf("最长递增子序列的长度为: %d\n", longestIncreasingSubsequence(nums, numsSize)); return 0; } ``` 这段代码首先定义了一个二维数组`dp`,然后使用两个嵌套循环遍历整个序列。内层循环中,如果当前元素`...

    js代码-求最长递增子序列

    在JavaScript编程中,"求最长递增子序列"(Longest Increasing Subsequence,LIS)是一个经典的动态规划问题。该问题旨在找到一个数组中的最长子序列,使得子序列中的元素顺序是递增的,但子序列不必是连续的。这个...

    最长递增子序列的另外一种C语言实现代码

    最长递增子序列(Longest Increasing Subsequence, LIS)是计算机科学中的一种经典算法问题,主要出现在算法设计与分析的课程中。这个问题的目标是从给定的一组整数中找到一个尽可能长的严格递增的子序列。在本例中...

    中科大算法导论课程实验 最长递增子序列 代码

    在本实验中,我们关注的是“最长递增子序列”(Longest Increasing Subsequence, LIS)这一经典问题,它是算法课程中的一个核心课题,尤其在动态规划的应用上有着重要的地位。中科大软件学院的这个实验旨在让学生...

    最长的单调递增子序列

    总结来说,这段代码通过动态规划的方法有效地解决了寻找最长单调递增子序列的问题,其核心在于利用辅助数组`D`记录到达每个位置时的最长递增子序列长度,并通过不断更新最大长度和对应下标找到最终答案。这种方法的...

    动态规划问题-最长单调递增子序列问题

    L={a1,a2,a3,…,an},是由n个不同的实数组成的序列,求L的最长单调递增子序列的长度(下标可不连续)

Global site tag (gtag.js) - Google Analytics