您的位置:首页 > 产品设计 > UI/UE

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]) ;和可以使用树状数组优化。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: