题目链接 点我
题意:给出n个数组成的序列,让你按顺序任选m个数,问得到的上升子序列个数 % 1000000007。
思路:较简单的dp,状态转移方程也好想。
用dp[i][j]表示以a[i]结尾的长度为j的上升子序列个数。
状态转移方程dp[i][j] = sigma(dp[k][j-1]) 其中(1 <= k < i && a[k] < a[i])。
主要是O(n^3)的时间复杂度过高,需要优化。我们考虑a[k] < a[i] 且 1 <= k < i,如果能够想到逆序对就成功了一半。 我们只需要用树状数组处理出a[i]前面比它小的数即可,这里我用了二维树状数组来维护。
时间复杂度为O(nmlog(n))
例如:
4 3
1 2 3 4
维护过程如下:横行为结尾元素编号,纵行为子序列长度,维护到最后,sum(4, 3)就是结果。
|
0 |
1 |
2 |
3 |
4 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
2 |
0 |
0 |
1 |
2 |
3 |
3 |
0 |
0 |
0 |
1 |
3 |
AC代码:
#include
#include
#include
#include
#include
#include