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

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

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位。
所以并不推荐使用。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5578672.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存