Codeforces597C Subsequences

题意:输入一个长度为n的序列和一个k(k<=10),问长度为k+1的递增子序列有多少个

题解:dp[i][j]代表前i个递增子序列并包括本身长度为k的个数。。。然后用树状数组维护一下

#include <bits/stdc++.h>
#define maxn 501000
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
ll dp[maxn][15], c[maxn][15], a[maxn];
void update(ll x,ll k,ll d){
    for(ll i=x;i<maxn;i+=i&(-i)) c[i][k] += d;
}
ll f(ll k, ll x){
    ll sum = 0;
    for(ll i=x;i>0;i-=i&(-i)) sum += c[i][k];
    return sum;
}
int main(){
    ll n, k;
    scanf("%lld%lld", &n, &k);
    for(ll i=1;i<=n;i++) scanf("%lld", &a[i]);
    dp[1][1] = 1;
    update(a[1], 1, dp[1][1]);
    for(ll i=2;i<=n;i++){
        dp[i][1] = 1;
        for(ll j=2;j<=k+1;j++)
            dp[i][j] = f(j-1, a[i]);
        for(ll j=1;j<=k;j++)
            update(a[i], j, dp[i][j]);
    }
    ll ans = 0;
    for(ll i=1;i<=n;i++) ans += dp[i][k+1];
    cout<<ans<<endl;
    return 0;
}

 

posted on 2018-01-23 21:53  2855669158  阅读(135)  评论(0编辑  收藏  举报

导航