题意

给出长度为n的序列,问这个序列中有多少个长度为m的单调递增子序列。

\(1\le M\le N\le 1000\)

分析

用F[i,j]表示前j个数构成以Aj为结尾的数列中,长度为i的严格递增子序列有多少个

\[F[i,j]=\sum_{k<j\wedge A_k<A_j}F[i-1,k]
\]

复杂度\(O(mn^2)\)。

观察到决策集合的变化一是只增不减,二是有一个前缀范围,用树状数组维护转移即可。时间复杂度\(O(mn\log n)\)

代码

#include<iostream>
#include<algorithm>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
using namespace std; co int N=1e3+1,INF=0x3f3f3f3f,mod=1e9+7;
int n,m,a[N],b[N],c[N],f[N][N],num;
void add(int x,int y){
for(;x<=n+1;x+=x&-x)
c[x]=(c[x]+y)%mod;
}
int ask(int x){
int ans=0;
for(;x;x-=x&-x)
ans=(ans+c[x])%mod;
return ans;
}
void The_Battle_of_Chibi(){
read(n),read(m);
for(int i=1;i<=n;++i) b[i]=read(a[i]);
sort(b+1,b+n+1);
for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+n+1,a[i])-b+1;
a[0]=f[0][0]=1;
for(int i=1;i<=m;++i){
fill(c+1,c+n+2,0);
add(1,f[i-1][0]);
for(int j=1;j<=n;++j){
f[i][j]=ask(a[j]-1);
add(a[j],f[i-1][j]);
}
}
int ans=0;
for(int i=1;i<=n;++i) ans=(ans+f[m][i])%mod;
printf("Case #%d: %d\n",++num,ans);
}
int main(){
for(int t=read<int>();t--;) The_Battle_of_Chibi();
return 0;
}

HDU5542 The Battle of Chibi的更多相关文章

  1. hdu5542 The Battle of Chibi【树状数组】【离散化】

    The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Othe ...

  2. hdu5542 The Battle of Chibi[DP+BIT]

    求给定序列中长度为M的上升子序列个数.$N,M<=1000$. 很容易想到方法.$f[i,j]$表示以第$i$个数结尾,长度为$j$的满足要求子序列个数.于是转移也就写出来了$f[i][j]+= ...

  3. 南阳ccpc C题 The Battle of Chibi && hdu5542 The Battle of Chibi (树状数组优化+dp)

    题意: 给你一个长度为n的数组,你需要从中找一个长度为m的严格上升子序列 问你最多能找到多少个 题解: 我们先对原序列从小到大排序,排序之后的序列就是一个上升序列 这里如果两个数相等的话,那么因为题目 ...

  4. The 2015 China Collegiate Programming Contest C. The Battle of Chibi hdu 5542

    The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Othe ...

  5. 2015南阳CCPC C - The Battle of Chibi DP

    C - The Battle of Chibi Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description Cao Cao made up a ...

  6. HDU - 5542 The Battle of Chibi(LIS+树状数组优化)

    The Battle of Chibi Cao Cao made up a big army and was going to invade the whole South China. Yu Zho ...

  7. CDOJ 1217 The Battle of Chibi

    The Battle of Chibi Time Limit: 6000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Othe ...

  8. 2015南阳CCPC C - The Battle of Chibi DP树状数组优化

    C - The Battle of Chibi Description Cao Cao made up a big army and was going to invade the whole Sou ...

  9. The Battle of Chibi(数据结构优化dp,树状数组)

    The Battle of Chibi Cao Cao made up a big army and was going to invade the whole South China. Yu Zho ...

随机推荐

  1. C# 关闭子窗体释放子窗体对象问题

    1 在主窗口中实例化子窗口 Form2 f2 = new Form2(); 2 通过按钮来显示子窗口 f2.Show(); 3 关闭子窗口而不释放子窗口对象的方法 protected override ...

  2. From传值

    第一个Form,Form1: string value = string.Empty; using (Form2 frm = new Form2()) { if (frm.ShowDialog() = ...

  3. Token国内地铁使用城市

    天津 广州 深圳 南京 武汉 台北 高雄

  4. git修改本地和远程仓库名称的解决方法

    说明:旧的仓库名称为mygit,新的仓库名称为Blog 1.修改远程仓库名称 在GitHub上进入要修改的仓库,找到settings,修改名称. 2.修改本地仓库名称 进入存放项目的目录,我的是/ho ...

  5. pymysql的使用与参数简要

    pymysql.Connect()参数说明 host(str): MySQL服务器地址 port(int): MySQL服务器端口号 user(str): 用户名 passwd(str): 密码 db ...

  6. openssl dgst(生成和验证数字签名)

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 该伪命令是单向加密工具,用于生成文件的摘要信息,也可以进行数字签名,验证数字 ...

  7. php 安装 redis扩展

    https://segmentfault.com/a/1190000009422920 wget 源码编译

  8. WIFI 万能钥匙万玉权:团队之中要有跨三界之外的“闲人” [转]

      在团队规模较小时,很多事情都可以变得特别简单.比如架构的选择,大部分情况下,最初的架构越简单越好,随着业务的演进,架构才不断完善. 连尚网络经历了从几人到上百人的管理过程,其自主创新研发的产品 W ...

  9. day40-python多进程多线程-多线程实例和锁

    多线程 线程是应用程序中工作的最小单元. 多线程是现实有两种方式:方法一:将要执行的方法作为参数传给Thread的构造方法(和多进程类似)t = threading.Thread(target=act ...

  10. Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单

    1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...