子序列的定義:對於一個序列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()");
}