利用动态规划找出最长公共单调递增子序列

1.设计一个O(n²)时间的算法。

方法如下:

①利用快速排序先将原序列排序。
②然后再计算原序列和已排序序列两者公共子序列。
③打印公共子序列。

代码如下:

/************************************************************************/  
/* 算法导论15.4-5 
 * 找出n个数的序列中最长的单调递增子序列 
 * 时间复杂度为O(n^2)*/  
/************************************************************************/  
#include 
#include 
using namespace std;
#define N 11
char *b[N+1][N+1]={NULL};
int c[N+1][N+1]={0};
void Lcs_Length(int *x,int *y) 
{
	for (int i1=0;i1<=N;i1++)
	{
		b[i1][0]="NULL";
	}
	for (int j1=0;j1<=N;j1++)
	{
		b[0][j1]="NULL";
	}
	for (int i=1;i<=N;i++)
	{
		for (int j=1;j<=N;j++)
		{
			if (x[i]==y[j])
			{
				c[i][j]=c[i-1][j-1]+1;
				b[i][j]="↖";
			}
			else
			{
				if (c[i-1][j]>=c[i][j-1])
				{
					c[i][j]=c[i-1][j];
					b[i][j]="↑";
				} 
				else
				{
					c[i][j]=c[i][j-1];
					b[i][j]="←";
				}
			}
		}
        
	}
}
void PRINT_LCS(int*x,int i,int j)
{
	if (i==0||j==0)
	{
		return;
	}
	if (b[i][j]=="↖")
	{
		PRINT_LCS(x,i-1,j-1);
		cout<

2.设计一个O(nlgn)时间的算法。

①如果当前元素比当前子序列中所有元素都大则最长递增子序列的长度加一。

②否则使用二分法在当前子序列中查找到大于等于当前元素的最小元素,用当前元素替换这个最小元素。

参考代码(我精简并更改了参考代码):点击打开链接

代码如下:

/************************************************************************/  
/* 算法导论15.4-6 
 * 找出n个数的序列中最长的单调递增子序列 
 * 时间复杂度为O(nlgn)*/  
/************************************************************************/  
#include 
#include 
#include 
using namespace std;
#define N 11
void printSequence(int *b,int* nums,int last);  
void main()
{
	srand( (unsigned)time( NULL ) );
    int nums[N+1]={0};  
	cout<<"原序列长度为"<nums[last[L==0?0:high]])  
        {//如果当前元素比last中所有元素都大则最长递增子序列的长度加一,其尾元素为当前元素nums[i]  
			last[L++]=i;
            b[i]=last[high];  
        }
		else
		{//否则使用二分法在last中查找到大于等于当前元素nums[i]的最小元素  
            while(low<=high)  
            {     
                int middle=(high+low)/2;  				
                if(nums[i]>nums[last[middle]])  
                    low=middle+1;  
                else  
                    high=middle-1;  
            }  
            //更新last中的元素值和b中的下标值。 
            last[low]=i;  
            b[i]=last[low==0 ? 0 : low-1]; 
        }  
    }  
	int len=L;
	cout<




你可能感兴趣的:(《算法导论》)