动态规划示例三

用空间换时间,将求解最大非递增子序列问题的时间复杂度降为O(N logN)

#include <stdio.h>
#include <stdlib.h>

int BinarySearch(int leftBound,int rightBound,int A[],int loopIndex,int minor[])
{
	int midIndex;
	while (leftBound<=rightBound)
	{
		midIndex = (leftBound+rightBound)/2;
		if (minor[midIndex]<A[loopIndex])
		{
			leftBound = midIndex+1;
		} 
		else
		{
			rightBound = midIndex-1;
		}
	}
	return leftBound;
}

int MaxSubLength(int A[],int ALength)
{
	//辅助矩阵
	int *minor = (int *)malloc(ALength*sizeof(int));
	int LoopIndex,leftBound,rightBound,MaxLength=1,insertPosition;
	minor[0] = A[0];
	for (LoopIndex=1;LoopIndex<ALength;LoopIndex++)
	{
		leftBound=0;
		rightBound=MaxLength;
		insertPosition = BinarySearch(leftBound,rightBound,A,LoopIndex,minor);
		minor[insertPosition]=A[LoopIndex];
		if (insertPosition>MaxLength)
		{
			MaxLength++;
		}
	}
	free(minor);
	return MaxLength;

}

int main()
{
	int A[11] = {2,1,5,3,6,4,8,9,7,8,9};
	int maxLength;
	maxLength = MaxSubLength(A,11);
	printf("the length is %d",maxLength);
	getchar();
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值