栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言怎么求一维数组的最长上升子序列?

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言怎么求一维数组的最长上升子序列?

题目:最长上升子序列的长度
如:1 4 -3 -9 5 9 0 //1 4 5 9
如:1,5,2,3,4,6,-5,-9,10,11// 1 2 3 4 6 10 11
子序列 不要求连续,前后关系要和原序列一致

最长递增子序列是非常经典的一个算法问题。看到题目时需注意子序列和子串是并不相同的,子串必须是连续的。所以第一时间想到的也是最无脑的方法----穷举法,似乎不能用了。真的不能用吗?可以,不过需要一些变通。

穷举法

穷举法就是把所有可能出现的情况一个一个例举出来再进行判断。在这题中单纯的循环遍历数组是行不通的,那只能求出最长上升子串。而我们知道子序列是数组的一个子集,那我们例举出该数组所有的子集不就可以了。那么怎么例举的呢?这就需要我们引入一个概念位运算。我们都知道数据存储在计算机中只有两种形式 0 或者 1 ,而我们以 0 或者 1 来指代这个数组的子集中是否含有该元素,0 和 1 所在的位置指代该元素在数组中的位置,然后再进行遍历判断该序列是否为上升序列就行了。

话不多说上代码

#include
int main()
{
	int i,j,t1,t2,n,N;
	printf("请输入数组的长度:n");
	scanf("%d",&N);
	int a[N];  //这里有些编译器不支持这种写法,直接将值固定就行。
	for (i =0; i < N; i++)
		scanf("%d",&a[i]);
	
	int max = 1;//存储最长上升子序列的长度
	for(j = 1 ; j < (1 < t2)  
				{
					n ++;
					if(n > max)
					{
						max = n;
					}
				}
				else 
				{
					break;
				}
			}
		}
	}
	printf("最长上升序列的长度为%dn",max);
}

但是这种方法的时间复杂度非常高(2N),并且只能判断32位数以下的数组-----int 类型只含有32位。
所以并不推荐使用。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/587467.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号