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) 编辑 收藏 举报