求子序列的長度

子序列的定義:對於一個序列a=a[1],a[2],......a[n],則非空序列a'=a[p1],a[p2]......a[pm]爲a的一個子序列,其中1<=p1<p2<.....<pm<=n。

例如:4,14,2,3和14,1,2,3都爲4,13,14,1,2,3的子序列。

對於給出序列a,有些子序列可能是相同的,這裏只算做1個,要求輸出a的不同子序列的數量。



輸入: 長度爲n的數組1<=n<=100,數組元素0<=a[i]<=110

輸出:子序列 的個數對1000000007取餘數的結果(由於答案比較大,輸出Mod 1000000007的結果即可)。


解答:

方法1: 遞歸求解。時間複雜度高

方法2: o(n).記錄以每個數字結尾的子序列長度,然後累加。


#include <iostream>
#include<cmath>
using namespace std;



int  get_seri_len(int *a ,int begin, int end){
	int num[111] = {0};
	int i = 0;
	int seri_len = 0;

	if (begin == end)
	{   
		return 0;
	}
	for (i = begin;i <end;i++)
	{
		if (num[a[i]] == 0)
		{
			seri_len += get_seri_len(a,i +1,end);
			seri_len ++;
		}
		num[a[i]] = 1;
		
	}
	
	seri_len = seri_len%1000000007;
	
	return seri_len;


}

int  run1(int *a ,int n)
{
	int seri_len = get_seri_len(a,0,n);
	return seri_len;
}

int  run(int *a ,int n)
{
	int num[111] = {0};
	int sum = 0;
	int i =0 ;
	int temp = 0;
	for(i =0;i<n;i++)
	{
		if(num[a[i]] == 0){
			num[a[i]] = sum +1;
			sum += num[a[i]];
			sum = sum%1000000007;
		}
		else
		{
			temp = sum +1;
			sum = sum +(sum+1 - num[a[i]]);
			num[a[i]] = temp;
			
			sum = sum%1000000007;
		}
	}



	return sum%1000000007;
	
}


int main()
{   
	const int n = 20;
	int a[n] = {4,5,1,2,2};
	int seri_len = 0;
	
	for (int i =0; i < n;i++)
		a[i] = rand()%110;
	
	seri_len = run(a,n);
	int seri_len1 = run1(a,n);
	cout<<seri_len<<endl;
	cout<<seri_len1<<endl;
	system("pause()");

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章