题意
给定一个长度为 的数组,求长度为 的不同子序列个数。()
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; }