题意
给定一个长度为 的数组,求长度为
的不同子序列个数。(
)
Solution
表示长度为
,删除
个元素的子序列个数,不考虑重复的话,有
(即已经删除了
个和已经删除了
个再删除这一个的情况)。
考虑去重。如果是单纯求不限长度的不同子序列的去重,容易得到: (
为上一次
出现的位置),在此题中也是同理,我们需要剔除
之间的元素,假设我们当前需要剔除
个元素,那么在
之前我们先需要剔除
个元素,
,初始化为所有的
。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int mod = 1e9 + 7;
int n, m, k, pre[N], dp[N][12];
int main() {
while (cin >> n >> m >> k) {
memset(dp, 0, sizeof(dp));
memset(pre, 0, sizeof(pre));
for (int i = 0; i <= n; i++) dp[i][0] = 1;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
for (int j = 1; j <= min(i, m); j++) {
dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1]) % mod;
if (pre[x] && j - (i - pre[x]) >= 0)
dp[i][j] = (dp[i][j] - dp[pre[x] - 1][j - (i - pre[x])] + mod) % mod;
}
pre[x] = i;
}
cout << dp[n][m] << '\n';
}
return 0;
}
京公网安备 11010502036488号