C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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

ソリューションアプローチ

この問題では、binaryindexツリーを使用して可能な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

  1. C++のバイナリツリーの最大パス合計

    この問題では、各ノードに値が含まれる二分木が与えられます。私たちのタスクは、二分木の2つの葉の間の最大パスの合計を見つけるプログラムを作成することです。 ここでは、値の最大合計を提供する、あるリーフノードから別のリーフノードへのパスを見つける必要があります。この最大合計パスには、ルートノードを含めることができます/含めることができません。 二分木 は、各ノードが最大2つの子ノードを持つことができるツリーデータ構造です。これらは左の子と右の子と呼ばれます。 例 − 問題を理解するために例を見てみましょう- 入力 −//二分木… 出力 − 24 説明 −リーフノード− 2から9へ

  2. C++の二分木で最大垂直和を見つける

    二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace