容易得到这样一个式子,假设dp[ i ]表示以i结尾的子序列个数,
则:
这样我们以ai为下标,维护一个前缀和即可,最后的答案就是所有dp的和(即更新到最后mx的前缀和),但是ai是1e9的,所以还需要离散化一下。
最后就是注意多组输入,,,WA了好多次原来错在这里
#define int ll
const int mod = 1e9 + 7;
int mx,w[MAXN], hs[MAXN],c[MAXN];
void update(int x, int v){while (x <= mx) {c[x] = (c[x] + v);x += (x & (-x));}}
int que(int x){int sum = 0;while (x){sum = (sum + c[x]) % mod;x -= (x & (-x));}return sum%mod;}
signed main()
{
int n;
while(cin >> n)
{
rpp(i, n) cin >> w[i], hs[i] = w[i];
sort(hs + 1, hs + 1 + n);
mx = unique(hs + 1, hs + n + 1) - (hs + 1);
rpp(i, n) w[i] = lower_bound(hs + 1, hs + mx + 1, w[i]) - hs;
rep(i,mx+1) c[i]=0;
rpp(i, n)
update(w[i],que(w[i]) + 1);
cout << que(mx) << endl;
}
return 0;
}