赤壁之战(dp&&树状数组)

本文介绍了如何利用动态规划(DP)和树状数组来解决寻找长度为M的严格递增子序列数量的问题。通过状态转移方程和树状数组的区间查询优化,可以将时间复杂度降低到1e7*logn。具体实现中需要对序列进行离散化处理以避免区间过大导致的时间超限。
摘要由CSDN通过智能技术生成

给定一个长度为N的序列A,求A有多少个长度为M的严格递增子序列。

输入格式

第一行包含整数T,表示共有T组测试数据。

每组数据,第一行包含两个整数N和M。

第二行包含N个整数,表示完整的序列A。

输出格式

每组数据输出一个结果,每个结果占一行。

输出格式为“Case #x: y”,x为数据组别序号,从1开始,y为结果。

由于数据可能很大,请你输入对109+7取模后的结果。

数据范围

1≤T≤100,
1≤M≤N≤1000,
∑Ti=1Ni×Mi≤107
序列中的整数的绝对值不超过109。

输入样例:

2
3 2
1 2 3
3 2
3 2 1

输出样例:

Case #1: 3
Case #2: 0

思路: 求长度为n的序列中长度为m的严格递增子序列的个数可用dp来做:

状态表示:

用f[i][j]表示编号i前面的严格递增长度为j的子序列的个数。

状态计算:

根据i前面严格递增子序列的倒数第二个数a[k]的不同将编号i前面的严格递增长度为len的子序列的方案划分为k个不同的方案,假设a[k]<a[i],则最后一个递增长度的贡献者就是a[k]<a[i]这个关系且该个数为1是固定的,所以只需要再看前面长度为len-1严格递增序列的个数之和即可,即:f[i][len]=sum(f[k][len-1])   (其中a[k]<a[i], 1<=k<=i-1)

这里在求sum(f[k]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值