51nod 1202 子序列個數

sad_lin發表於2024-09-09

1202 子序列個數

\(dp[i]\) 為第i個數不同子序列個數,先不考慮重複的情況,每個數只有選不選,轉移方程為 \(dp[i]=dp[i-1]\times 2\),但現在我們要求的是不同的子序列個數,因此要減去重複的子序列個數。對於選取了 \(a_i\) 的子序列,會出現重複的序列一定是以某一個滿足 \(a_j=a_i\)\(a_j\) 結尾的,那麼重複的子序列個數就是 \(dp[j-1]\),其中 \(j\) 是最大的滿 \(a_j=a_i\) 並且 \(j<i\) 的數。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
const int mod=1e9+7;
int n,m;
ll dp[N];
map<ll,ll> a;
ll b[N];
int main(){ 
    ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	dp[0]=1;
	for(int i=1;i<=n;i++){
		dp[i]=(dp[i-1]*2-dp[a[b[i]]-1]+mod)%mod;
		a[b[i]]=i;
	}
	cout<<dp[n]-1;
    return 0;
}

相關文章