最长上升子序列

最长上升子序列的概念理解

上升序列:对于一个序列 a1<a2<a3…<an时,我们称这个序列是上升的

子序列:一个字符串 s 被称作另一个字符串 S 的子序列,说明从序列 S 通过去除某些元素但不破坏余下元素的相对位置(在前或在后)可得到序列 s 。

最长上升子序列:也就是在S中找到一个最长的子序列,且满足为一个上升序列

以4 2 1 3 5为例:就有2,3,5或者1,3,5这两个都是它的最长上升子序列

状态方程

用a[]数组存放某个序列
f[],f[i]存放来存放以a[i]为最长上升子序列的最后一个时,这个最长上升子序列的长度。

在这里插入图片描述
条件为:
在这里插入图片描述

过程图解

以2 5 3 4 1 7 6为例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时最大值为4,则最长上升子序列的长度为4

c语言代码

代码样例(仅供参考)

#include <stdio.h>
int n,a[1001],b[1001],p[1001],c[1001],cou=0;
int main()
{int i,j,max=0,x=0;
	scanf("%d",&n);	// 输入个数 
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(i=0;i<n;i++)//	从第一个数到最后一个数 
		{	max=0;
			x=0;
			for(j=0;j<=i;j++)//以a[i]为最后一个的个数 ,当i前面有比他小的数,可以加入 
				{
					if(a[j]<a[i]&&b[j]>max)//	比他小,并且找出在比他小的字母里以该字母为结尾时长度最长的一个 
						{
							max=b[j];//	找出最大的 并记录下榻的位置 
							x=j;	 
						}
				
				}
			b[i]=max+1;//	最大加一 ,并存放上一位是谁 
			p[i]=x;	
		}
	for(i=0;i<n;i++)//找出最大的长度 
		if(b[i]>max)
			{
				max=b[i];
				x=i;
			}
	printf("%d\n",max);//输出最大的长度是多大 
	while(max--)//
		{
			c[cou]=a[x];//从后面往前找出一个最长上升子序列,最大的就在c里面的第一个 
			cou++;
			x=p[x];
		}
	for(i=cou-1;i>=0;i--)//输出最长。。。 
		printf("%d ",c[i]);	
	return 0;
}

运行样例
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@玉面小蛟龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值