序列有关的dp 状态dp[i]dp[i]定义为第ii个数字时的 子序列状态有多少个
考虑状态转移方程: dp[i]=dp[i−1]∗2dp[i]=dp[i−1]∗2 dp[i]=dp[i−1]∗2−dp[j−1]dp[i]=dp[i−1]∗2−dp[j−1]
感觉这种题都很有模板的感觉TAT
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = (int)2e5+10;
const int mod = (int)1e9+7;
int arr[MAXN];
ll dp[MAXN];
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> arr[i];
dp[0] = 1;
map<int, int> mp;
for(int i = 1; i <= n; ++i) {
if(mp[arr[i]]) {
int j = mp[arr[i]];
dp[i] = (dp[i - 1] * 2 - dp[j - 1] + mod) % mod;
}
else {
dp[i] = (dp[i-1]*2) % mod;
}
mp[arr[i]] = i;
}
cout << dp[n]-1 << endl;
return 0;
}