Codeforces Testing Round #12C - Subsequences (dp+树状数组优化)
2015-11-12 15:56
639 查看
> 题目链接
题意:在n个数中,找出长度是k的上升子序列个数,(n个数都不相同)
解答:dp[i][j]:表示以i结尾的长度是j的上升序列的个数,那么dp[i][j]=dp[1][j-1]+dp[2][j-1]+dp[3][j-1]+….+dp[k-1][j-1]
(1<= k < i , a [k] < a [i]) ;和可以使用树状数组优化。
题意:在n个数中,找出长度是k的上升子序列个数,(n个数都不相同)
解答:dp[i][j]:表示以i结尾的长度是j的上升序列的个数,那么dp[i][j]=dp[1][j-1]+dp[2][j-1]+dp[3][j-1]+….+dp[k-1][j-1]
(1<= k < i , a [k] < a [i]) ;和可以使用树状数组优化。
#include<bits/stdc++.h> using namespace std; #define LL long long #define pb push_back #define X first #define Y second #define cl(a,b) memset(a,b,sizeof(a)) typedef pair<int,int> P; const int maxn=100005; const int inf=1<<27; LL c[maxn][13]; int n,k; void update(int x,int y,LL val){ while(x<maxn){ c[x][y]+=val; x+=x&-x; } } LL sum(int x,int y){ LL ans=0; while(x>0){ ans+=c[x][y]; x-=x&-x; } return ans; } int main(){ scanf("%d%d",&n,&k);k++; update(1,0,1); for(int i=1;i<=n;i++){ int x;scanf("%d",&x); for(int j=k;j>=1;j--)update(x,j,sum(x,j-1)); } printf("%lld\n",sum(n+1,k)); return 0; }
相关文章推荐
- break语句和continue语句
- 使用uiautomator时遇到问题的处理方法
- easyui ComboBox 中文检索问题
- Range Sum Query 2D - Immutable
- iOSUI调试工具------Reveal
- UIAlertController
- CYC-UITableViewCell的动态高度
- UIScrollView 的subViews的问题
- 让UITableView的section header view不悬停的方法
- ant <copy文件忽略目录结构flatten="true"
- Django中request和response中的属性方法详述
- UIView 控件
- Mac下安装使用apktool,jd-gui进行反编译
- karma+requirejs+angular 测试
- Bluemix 动手系列 (二) 通过命令行部署和更新云应用
- java web 通过前台输入的数据(name-value)保存到后台 xml文件中
- uiscrollview和uiimagevie的代理实现
- iOS中UIPickerView详解
- UIView的层次结构--code
- IOS中UIView的响应事件,属性和方法