给定一个长度为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]