找到递增子序列的数量
Find the number of increasing sub sequence
我想找到数组中递增子序列的数量,我遇到了一个二叉索引树,它为我们提供了O(log n)
解决方案。
我无法理解用于 BIT 的代码:
void madd(int& a, int b)
{
a += b;
}
// fenwick code
void update(int i, int x)
{
for (++i; i < MAX_N; i += i & -i) madd(ft[i], x);
}
int query(int i)
{
int s = 0;
for (++i; i > 0; i -= i & -i) madd(s, ft[i]);
return s;
}
for (int i = 0; i < N; i++)
{
dp[i] = 1 + query(H[i] - 1); // H[i] contains the our number array
update(H[i], dp[i]);
}
请帮助我理解它。
谢谢
算法的思想相当简单:
-
让我们创建一个数组
f
,其中f[i]
是将i
作为最后一个元素的递增子序列的数量。最初它用零填充。 -
让我们遍历初始数组的所有元素并更新
f
值。如果当前元素是h
,那么我们可以将其添加到最后一个元素小于h
的所有递增子序列中,或者创建一个仅包含此数字的新子序列。这就是为什么dp[i] = sum(f[j]) + 1
,0 <= j < h
.
BIT可用于查找数组前缀的总和并有效地更新一个元素(步骤2需要),这就是为什么它被用来存储f
值。
相关文章:
- 没有找到相关文章