Codeforces 597C Subsequences dp + 树状数组
来源:互联网 发布:wamp php.ini在哪 编辑:程序博客网 时间:2024/05/16 14:07
题意
- 给你n的一个排列,问你包含k个数的子序列个数有多少。
- n <= 10^5,k <= 11
思路
- dp
- 状态dp[i][j] 表示前i个数,包含k个数的子序列个数有多少
- f[i][j]表示前i个数,以a[i]结尾的,包含k个数的子序列有多少
- dp[i][j] = dp[i-1][j] + f[i][j] 这个转移很容易想到
- 具体f[i][j]怎么转移,稍微有点麻烦
- f[i][j] = sum f[k][j-1] 其中1<=k < i 且 a[k] < a[i]
- 这个转移也不难理解,但是转移的复杂度是O(n)的了,我们用树状数组来解决问题
- 由于1<=a[i] <= n,所以我们可以以a[i]作为下标建立k个树状数组,第j个树a[i]的位置存f[i][j],当我们更新f[i]时,此时我们只需查询1~a[i]的前缀和即可,最后再用f[i]更新树的a[i]节点即可
实现
#include <cstring>#include <algorithm>#include <cstdio>#include <iostream>using namespace std;const int maxn = 100005;int n,k;typedef long long ll;int a[maxn];ll dp[maxn][12];ll f[maxn][12];ll tree[maxn][12];inline int lowbit(int x){ return x&(-x);}void update(int i,ll x,int j){ while(i<=n) { tree[i][j] += x; i += lowbit(i); }}ll query(int i,int j){ ll ret = 0; while(i > 0) { ret += tree[i][j]; i -= lowbit(i); } return ret;}int main(){ cin>>n>>k; k++; for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) { f[i][1] = 1; dp[i][1] = i; } update(a[1],1,1); for (int i=2;i<=n;i++){ for (int j=min(i,k);j>1;j--){ f[i][j] = query(a[i],j-1); update(a[i],f[i][j],j); } update(a[i],1,1); } for (int i=2;i<=n;i++){ for (int j=2;j<=min(i,k);j++){ dp[i][j] = dp[i-1][j] + f[i][j]; } } cout << dp[n][k] << "\n"; return 0;}
1 0
- Codeforces 597C Subsequences dp + 树状数组
- Subsequences CodeForces - 597C 树状数组 + dp
- Codeforces 597C Subsequences 【树状数组优化DP】
- Codeforces 597C Subsequences【Dp+二维树状数组】
- codeforces-597C-Subsequences【树状数组】
- 597C. Subsequences【DP】【树状数组】
- 【Codeforces 597C】【DP 树状数组优化】Subsequences 【n个不同数,长度为k+1的LIS数】
- Codeforces Testing Round #12C - Subsequences (dp+树状数组优化)
- Codeforces 597C(树状数组 + dp)
- codeforces 597C (树状数组+DP)
- CodeForces 597C 树状数组 dp
- CF - 314C - Sereja and Subsequences(树状数组+dp)
- 【Codeforces 597C】 Subsequences - DP 主席树
- 【Codeforces Testing Round 12C】【DP 树状数组优化】Subsequences n个不同数,长度为m的LIS数
- 树状数组+dp(不太懂) Codeforces 597C
- [dp+树状数组优化] CF597C. Subsequences
- CodeForces 315E - Sereja and Subsequences 阅读理解+树状数组
- Lightoj 1085 All Possible Increasing Subsequences (树状数组+DP)
- leetcode -- Maximum Product of Word Lengths -- 重点
- Android的selector,背景选择器
- Windows下 Android Studio中获取SHA1的方法
- javascript 浏览器调用原理
- OC学习_8_内存管理_MRC
- Codeforces 597C Subsequences dp + 树状数组
- 黑马程序员——Java语言基础(下)
- Linux查看系统信息的一些命令及查看已安装软件包的命令(转)
- Redis和MongoDB原理简析
- eclipse中 将java项目转换为web项目
- oracle VPD
- 数据结构学期学习总结
- Day0-纠结,思念,与未来
- 增量更新