求數組中最長遞增子序列

  • 動態規劃求解編程

int calculate(int a[], int n)
{
	int i;
	int maxV;
	//maxLen[i]表明截止到下標爲i(包括i)的最長子序列的長度
	int * maxLen = (int *)malloc(n*sizeof(int));

	for(i=0;i<n;i++)
	{
		maxLen[i]=1;
		for(int j = 0;j<i;j++)
		{
			if(a[i]>a[j] && maxLen[j]+1>maxLen[i])
			{
				maxLen[i] = maxLen[j]+1;
			}
		}
	}
	maxV = max(maxLen,n);
	free(maxLen);

	return maxV;
}

時間複雜的爲O(n*n)code


  • 進一步分析class

    若是前i-1個元素的任何一個遞增子序列的最大值小於第i個元素,那麼就能夠構成一個新的遞增子序列。重要的是咱們要保證新的遞增子序列儘量的長。書籍


  • int calculate(int a[],int n)
    {
    
    	int i,j;
    
    	//若是存在含有元素相同個數的多個子序列,長度爲i,將多個子序列的最大值中的最小值存入minV[i]
    	int * maxV = (int *)malloc(sizeof(int) * (n+1));
    	//maxLen[i]表明截止到下標爲i(包括i)的最長子序列的長度
    	int * maxLen = (int *)malloc(sizeof(int) * n);
    	//記錄最長子序列的長度,初始爲1
    	int max = 1;
    
    	maxV[1] = a[0];
    	maxV[0] = min(a,n)-1;
    
    	for(i=0;i<n;i++)
    	{
    		//初始化爲1
    		maxLen[i]=1;
    	}
    
    	for(i=1;i<n;i++)
    	{
    		for(j=max;j>=0;j--)
    		{
    			//若是當前值a[i]大於長度爲j的遞增子序列,則能夠構成長度爲j+1的遞增子序列。
    			if(a[i]>maxV[j])
    			{
    				maxLen[i]=j+1;
    				break;
    			}
    		}
    	}
    
    	//若是截止到下標爲i(包括i)的最長子序列的長度大於記錄max,則將max賦值爲maxLen[i]
    	if(maxLen[i]>max)
    	{
    		max=maxLen[i];
    		//該長度爲maxLen[i]的子序列的最大值必定爲a[i]
    		maxV[maxLen[i]]=a[i];
    	}
    	else if(maxV[j] < a[i] && a[i] < maxV[j+1])
    	{
    		maxV[j+1] = a[i];
    	}
    
    	free(maxV);
    	free(maxLen);
    
    	return max;
    
    }

    時間複雜度O(n*n)動態規劃


參考書籍:《編程之美》時間

相關文章
相關標籤/搜索