C++程序中使用二叉索引树求最大和递增子序列
在这个问题中,我们给定一个包含n个整数的数组arr[]。我们的任务是创建一个C++程序来使用二叉索引树查找最大和递增子序列。
问题描述 - 我们需要使用数组的元素找到具有最大和的递增子序列。
递增子序列 - 子序列中当前元素的值大于前一个位置的元素。
二叉索引树 - 是一种树型数据结构。我们可以有效地向树中添加或删除元素。
让我们举个例子来理解这个问题:
输入
arr[] = {5, 1, 7, 3, 8, 2}
输出
20
解释
Subsequences: {5, 7, 8} = 5 + 7 + 8 = 20 {1, 3, 8} = 1 + 3 + 8 = 12 {1, 7, 8} = 1 + 7 + 8 = 16
解决方案方法
在这个问题中,我们需要使用二叉索引树找到可能的maxSum。为此,我们将使用来自数组元素的映射创建一个二叉索引树。然后通过迭代数组元素,对于每个元素,我们需要找到BIT中所有元素的总和。然后返回所有值的和的最大值。
示例
程序说明了我们解决方案的工作原理:
#include <bits/stdc++.h> using namespace std; int calcMaxSum(int BITree[], int index){ int sum = 0; while (index > 0) { sum = max(sum, BITree[index]); index −= index & (−index); } return sum; } void updateTreeVal(int BITree[], int newIndex, int index, int sumVal){ while (index <= newIndex) { BITree[index] = max(sumVal, BITree[index]); index += index & (−index); } } int calcMaxSumBIT(int arr[], int n){ int uniqCount = 0, maxSum; map<int, int> BinaryIndexTree; for (int i = 0; i < n; i++) { BinaryIndexTree[arr[i]] = 0; } for (map<int, int>::iterator it = BinaryIndexTree.begin(); it != BinaryIndexTree.end(); it++) { uniqCount++; BinaryIndexTree[it−>first] = uniqCount; } int* BITree = new int[uniqCount + 1]; for (int i = 0; i <= uniqCount; i++) { BITree[i] = 0; } for (int i = 0; i < n; i++) { maxSum = calcMaxSum(BITree, BinaryIndexTree[arr[i]] − 1); updateTreeVal(BITree, uniqCount, BinaryIndexTree[arr[i]], maxSum + arr[i]); } return calcMaxSum(BITree, uniqCount); } int main(){ int arr[] = {5, 1, 7, 3, 8, 2}; int n = sizeof(arr) / sizeof(arr[0]); cout<<"The maximum sum increasing subsequence using binary indexed tree is "<<calcMaxSumBIT(arr, n); return 0; }
输出
The maximum sum increasing subsequence using binary indexed tree is 20
广告