求最长递增子序列

下面程序是用动态规划法写的

void LIS(int *a,int n)
{
	int *Lis=new int[n];   //存储以i为结尾的最长子序列,动态规划法
	int *prev=new int[n];  //prev[]存储最长子序列的每一个值的“前驱”的下标值,
	                       //例如测试中的最长子序列1,4,8,10(下标分别为0,2,4,6),则prev[0]=-1,prev[2]=0,prev[4]=2,prev[6]=4
	memset(prev,-1,n*sizeof(int)); //所有元素的“前驱”的下标值初始化为-1,
	memset(Lis,0,n*sizeof(int));
	int maxLen=0;        //整个数组的最长子序列的长度
	int maxIndex;        //存储最长子序列的最后一个值的下标
	for (int i=0;i<n;i++)
	{	
		Lis[i]=1;
		for (int j=0;j<i;j++)//这层循环求取以i结尾的最长子序列
		{
			if (a[i]>a[j] && Lis[j]+1>Lis[i])
			{	//动态规划
				Lis[i]=Lis[j]+1;
				prev[i]=j;
			}
		}
		if (maxLen<Lis[i])//如果当前lis[i]>maxLen,则更新maxLen
		{
			maxLen=Lis[i];
			maxIndex=i;  //最长子序列的最有一个元素下标更新为i,相当于子序列增长了
		}
	}
	cout<<maxLen<<endl;
	i=maxIndex;
	while(i!=-1)
	{
		cout<<a[i]<<" ";
		i=prev[i];
	}
	cout<<endl;
	delete [] Lis;
}

void main() 
{  
	int a[8]={1,-1,4,-5,8,-7,10,-9};
	LIS(a,8);
}  


测试如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值