Codeforces 597C(树状数组 + dp)

原创 2015年11月20日 12:24:54

@(K ACMer)


题意:
由1到n,共n个数构成的序列中长为k + 1的上升子序列有多少个?
分析:
注意到题中数字是1到n,且子序列最长只有11.我们可以这样定义状态:dp[i][j]为长度为i的子序列中,末尾数以j结尾的个数.
那么容易有转移方程:

dp[i][j]=t=1...j1dp[i1][t]
显然这个复杂度是O(kn2)的,过大,注意到我们这里每次都是求的数组的前缀和,那不是用一个树状数组来维护就好了么?这样复杂度就变为了O(knlogn)


code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <string>
#include <queue>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
typedef pair<int, int> pii;
typedef unsigned long long ll;
typedef vector<int> vi;
#define xx first
#define yy second
const int mod = int(1e9) + 7, INF = 0x3fffffff, maxn = 1e5 + 41;
ll dp[12][maxn];
int n, k, ans;

ll sum(int x, int i) {
    ll ret = 0;
    while (i > 0) {
        ret += dp[x][i];
        i -= i & -i;
    }
    return ret;
}

void add(int y, int i, ll x) {
    while (i <= n) {
        dp[y][i] += x;
        i += i & -i;
    }
    return;
}

int main(void) {
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++) {
        int x;
        scanf("%d", &x);
        for (int i = k + 1; i >= 1; i--) {
            ll temp = (i - 1 == 0) ? 1 :sum(i - 1, x - 1);
            add(i, x, temp);
        }
    }
    cout << sum(k + 1, n) << endl;
    return 0;
}
版权声明:本文为博主原创文章,转载请注明作者:jibancanyang。

CodeForces - 859C Pie Rules DP(逆推)(思维好题)

传送门:Codeforces 859c 题意:有n个物品,每个物品有不同的价值,物品按顺序分给两个人,有一块令牌,每回合拥有令牌的人拥有物品的分配权,但是该回合未获得物品的那个人会在下回合获得令牌,...
  • lxy767087094
  • lxy767087094
  • 2017年09月20日 23:20
  • 390

codeforces 597C (树状数组+DP)

题目链接:http://codeforces.com/contest/597/problem/C 思路:dp[i][j]表示长度为i,以j结尾的上升子序列,则有dp[i][j]= ∑dp[i-1][...
  • West___wind
  • West___wind
  • 2016年08月19日 22:37
  • 193

CodeForces 597C 树状数组 dp

CodeForces 597C #include #include #include #define ll long long using namespace std; const ll maxn ...
  • qq_35346829
  • qq_35346829
  • 2017年01月16日 10:29
  • 74

Codeforces 597C Subsequences dp + 树状数组

题意 给你n的一个排列,问你包含k个数的子序列个数有多少。 n
  • luke2834
  • luke2834
  • 2015年12月21日 22:10
  • 473

Subsequences CodeForces - 597C 树状数组 + dp

传送门 : CF 579c题解 dp 状态ans[i][j] 表示前i个数,包含j个数的子序列个数有多少 f[i][j]表示前i个数,以a[i]结尾的,包含j个数的子序列有多少 ...
  • ADjky
  • ADjky
  • 2016年12月14日 13:16
  • 168

树状数组+dp(不太懂) Codeforces 597C

C. Subsequences time limit per test 1 second memory limit per test 256 megabytes in...
  • FengTwoYear
  • FengTwoYear
  • 2015年11月20日 19:01
  • 764

Codeforces 597C Subsequences 【树状数组优化DP】

C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年11月13日 21:57
  • 460

codeforces 827C 树状数组

C. DNA Evolution time limit per test 2 seconds memory limit per test 512 megabytes ...
  • KIDGIN7439
  • KIDGIN7439
  • 2017年09月01日 11:19
  • 204

【Codeforces 597C】 Subsequences - DP 主席树

题意:给一个长度为n的排列,求长度为k+1的上升子序列个数。  很显然的DP,f[j][i]f[j][i]表示到了第i位,取了长度为j的序列。   f[j][i]=∑a[k]...
  • GEOTCBRL
  • GEOTCBRL
  • 2015年12月21日 21:16
  • 507

CodeForces830B【树状数组+线段树】

思路: 就是 你好像就是要维护一下,你pop的当前值与之前的pop值的位置之间有多少个要移一移,然后算一下,然后就变成了模拟。。 线段树维护 值 和 位置,树状数组维护已经取了没有。 7 ...
  • KEYboarderQQ
  • KEYboarderQQ
  • 2017年07月28日 15:22
  • 176
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces 597C(树状数组 + dp)
举报原因:
原因补充:

(最多只允许输入30个字)