子序列的定义:对于一个序列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的不同子序列的数量。
#define MAXN 1000005
#define MOD 1000000007
int subquense(int* arr, int len) {
/* dp[i]表示以[1~i]内的每个元素结尾的不同子序列个数之和*/
int* dp = new int[MAXN];
//hash表,对应元素下标
int* prevX = new int[MAXN];
memset(prevX, -1, MAXN);
memset(dp, 0, MAXN);
for (int i = 1; i <= len; ++i) {
if (prevX[arr[i - 1]] == -1) { //元素没有出现过
dp[i] = (2 * dp[i - 1] + 1) % MOD;
} else { //元素已经出现
dp[i] = (2 * dp[i - 1] - dp[prevX[arr[i - 1]] - 1] + MOD) % MOD;
}
prevX[arr[i - 1]] = i;
}
return dp[len];
}